0

我创建了一个带有 3 个参数的存储过程。我对第二个参数([HQ-211-STOCK-DBO])有疑问。我一直试图弄清楚它已经有一段时间了。

这是对 SP 的调用:

EXEC [dbo].[spColumnsChanged] '[HQ-193-STOCK-DBO]','[HQ-211-STOCK-DBO]','arch_conv_col_diffs'

在 SP 中,我有以下代码:

CREATE PROCEDURE [dbo].[spColumnsChanged] (@sr_database nvarchar(128),@tr_database nvarchar(128),@diff_table nvarchar(128))

...

SET @DFCursor = CURSOR FAST_FORWARD FOR 
SELECT o.name table_name, col.name column_name, t.name data_type, col.max_length, col.is_nullable
 FROM @tr_database.sys.columns col
 INNER JOIN @tr_database.dbo.sysobjects o on o.id = col.object_id
 INNER JOIN @tr_database.sys.types t ON t.user_type_id = col.user_type_id
 WHERE o.xtype = 'U'   -- user tables
 ORDER BY o.name, col.column_id

当我运行 SP 时,我收到错误消息:“(消息 102,第 63 行)'.' 附近的语法不正确。”

第 63 行是使用 SP 的第三个参数的 FROM 语句。(@tr_database)

有趣的是,如果我用实际参数值代替参数,如下所示:

    SELECT o.name table_name, col.name column_name, t.name data_type, col.max_length, col.is_nullable
    FROM [HQ-211-STOCK-DBO].sys.columns col
     INNER JOIN [HQ-211-STOCK-DBO].dbo.sysobjects o on o.id = col.object_id
     INNER JOIN [HQ-211-STOCK-DBO].sys.types t ON t.user_type_id = col.user_type_id
     WHERE o.xtype = 'U'   -- user tables
     ORDER BY o.name, col.column_id

它工作正常。

任何人都可以发现错误吗?

4

1 回答 1

3

您需要的是动态 sql

您不能设置作为表/视图/函数或其他数据库对象名称的参数。您需要的是以下方面:

declare @sql nvarchar(max)
SET @SQL = 'SET @DFCursor = CURSOR FAST_FORWARD FOR 
            SELECT o.name table_name, col.name column_name, t.name data_type,
                   col.max_length, col.is_nullable
             FROM '+@tr_database+'.sys.columns col
             INNER JOIN '+@tr_databasee+'.dbo.sysobjects o 
                     ON o.id = col.object_id
             INNER JOIN '+@tr_databasee+'.sys.types t 
                     ON t.user_type_id = col.user_type_id
             WHERE o.xtype = ''U''
             ORDER BY o.name, col.column_id'
EXECUTE(@SQL)

恕我直言,从维护和性能的角度来看,将游标与动态 SQL 混合将是一场噩梦,但对于一次性的代码,它可能会起作用。

于 2013-10-04T14:59:26.720 回答