我需要获取位于另一个数据库中的表的列名。以下脚本适用于活动数据库,但我需要针对同一服务器实例中的另一个数据库运行它:
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);
这是问题所在......数据库在编译时是未知的。它在运行时传递到存储过程中。所以我别无选择,只能使用动态 sql。过去我曾尝试Use [DBName]
在动态 sql 脚本中使用,但总是遇到问题,直到我意识到我可以这样做:
SET @SQL = 'SELECT Foo FROM Bar'
SET @sp_executesql = quotename(@DatabaseName) + '..sp_executesql'
EXECUTE @sp_executesql @SQL
但是我很难弄清楚如何使用上面提到的脚本来做到这一点。我的第一次尝试看起来像:
-- @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
但是当它运行时,它不会被解释@ColumnList
为一个有效的变量。我错过了什么?