我创建了一个带有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时,我收到错误: “(Msg 102,第63行)”。“附近的语法不正确。”
第63行是FROM语句,它使用SP的第3个参数。 (@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
工作正常。
有人能发现错误吗?
答案 0 :(得分:3)
您需要的是dynamic 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混合将是噩梦,从维护和性能的角度来看,但是,对于一次性的代码,它可能会起作用。