sql-server - 使用params在另一个数据库中执行存储过程

标签 sql-server tsql stored-procedures dynamic-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);

问题是……在编译时数据库是未知的。它在运行时传递给存储过程。所以我别无选择,只能使用动态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作为有效变量。我错过了什么?

最佳答案

我不确定您是从哪里获得该语法的,但这是我的做法:

-- I assume these are parameters, so declaring them separately:
DECLARE 
    @DatabaseName SYSNAME = N'db_name',
    @TableName SYSNAME = N'table_name';

DECLARE 
    @sql NVARCHAR(MAX), 
    @columnList NVARCHAR(MAX);

SELECT @sql = N'SELECT @ColumnList = COALESCE(@ColumnList + '','', '''') 
    + c.name
    FROM [$db$].sys.columns AS c
    INNER JOIN [$db$].sys.tables AS o
    ON c.[object_id] = o.[object_id]
    WHERE o.name = @TableName;';

SET @sql = REPLACE(@sql, '$db$', @DatabaseName);

EXEC sp_executesql @sql, 
    N'@ColumnList NVARCHAR(MAX) OUTPUT, @TableName SYSNAME',
    @ColumnList OUTPUT, @TableName;

SELECT @ColumnList

关于sql-server - 使用params在另一个数据库中执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199111/

相关文章:

php - Mysql 存储过程 - 如果未找到数据则返回表头

mysql - 如何将来自 SELECT 语句的值存储在 MySQL 存储过程的变量中?

sql-server - 从 SQL Server 新建的表中获取记录时出现超时错误

sql-server - 如何在返回表中查找父 ID

sql - 在选择语句中获取每组的最新条目

sql-server - 使用 GROUP BY 时需要返回表中的所有列

sql-server - SQL Server varbinary trailing 0 解释

sql - '6/1/201 2' < ' 6/1/2012 0 :00:00. 000' = 真?

sql-server - 动态替换 XML DML 中节点的值

.net - 如果使用 Linq 和 EF,SP 是否多余(最佳实践)