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
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de l'endroit où vous avez ramassé que la syntaxe, mais voici comment je ferais:
EXEC @sp_executesql @sql
- Je suppose que vous vouliez appelerEXEC sp_executesql @sql
d'une certaine façon.EXEC @sp_executesql @sql
utilise imbriqués sql dynamique pour appelersp_executesql
contre@DatabaseName
. Ramassé à partir de iciJuste très bizarre d'appeler la variable
@sp_executesql
et l'utiliser exactement dans un endroit où la procédure stockéesp_executesql
serait attendu. Imbriquée SQL dynamique ne semble pas être nécessaire ici... avez-vous essayé mon code?L'essayer maintenant.
OriginalL'auteur Aaron Bertrand
Vous devez supprimer le
=
signes de l' @params argument et ajouterOUT
ouOUTPUT
après la @ColumnList argument.Correct:
Incorrect:
OriginalL'auteur Anthony Faull