Exécuter une procédure stockée dans une autre base de données avec params

J'ai besoin d'obtenir les noms de colonne d'un tableau qui se trouve dans une autre base de données. Le script suivant fonctionne pour la base de données active, mais j'ai besoin de l'exécuter à l'encontre d'une autre base de données dans la même instance de serveur:

SELECT @ColumnList = 
    CASE
        WHEN @ColumnList IS NULL THEN name
        WHEN @ColumnList IS NOT NULL THEN @ColumnList + ',' + name
    END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);

Voici la question... la base de données n'est pas connue au moment de la compilation. Son passé dans une procédure stockée lors de l'exécution. Donc je ne vois pas d'autre solution que d'utiliser le sql dynamique. Dans le passé, j'ai essayé d'utiliser Use [DBName] dans une dynamique de script sql, mais se sont toujours heurtées à des problèmes jusqu'à ce que j'ai réalisé que je pouvais faire ceci:

SET @SQL = 'SELECT Foo FROM Bar'
SET @sp_executesql = quotename(@DatabaseName) + '..sp_executesql'
EXECUTE @sp_executesql @SQL

Mais je vais avoir de la difficulté à trouver comment le faire avec le script que j'ai mentionné ci-dessus. Ma première tentative ressemblait:

-- @DatabaseName and @TableName are parameters of the 
-- stored procedure containing this script

DECLARE @ColumnList nvarchar(max),
        @SQL nvarchar(max),
        @sp_executesql nvarchar(max) = quotename(@DatabaseName) + '..sp_executesql';
SET @SQL = 
'SELECT @ColumnList = 
    CASE
        WHEN @ColumnList IS NULL THEN name
        WHEN @ColumnList IS NOT NULL THEN @ColumnList + '','' + name
    END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);'

EXECUTE @sp_executesql @SQL,
        N'@ColumnList = nvarchar(max) OUT, @TableName = sysname',
        @ColumnList, @TableName

Mais quand il s'exécute, il n'interprète pas @ColumnList comme une variable valide. Ce qui me manque?

OriginalL'auteur Kenneth Cochran | 2012-04-17