我是SQL服务器的新手。我的要求是使用游标使用动态SQL更新表。当我运行该过程时,获取成功的消息。但没有得到结果。请找到下面的代码,帮助我解决问题。
ALTER PROCEDURE sp_Update(@IN_TABLENAME VARCHAR)
AS
DECLARE @v_tblname NVARCHAR(50),
@v_existing_column NVARCHAR(50),
@v_new_column NVARCHAR(50),
@v_key INTEGER,
@SQLString NVARCHAR(2000)
DECLARE TblCur CURSOR FOR
SELECT TblNAME, CURR_COLUMN, NEW_COLUMN, Seq_KEY FROM CONTROL_Table
WHERE
TblNAME=@IN_TABLENAME
OPEN TblCur FETCH NEXT FROM TblCur
INTO @v_tblname, @v_existing_column, @v_new_column, @v_key
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString = N'UPDATE @v_tblname SET @v_new_column = ReferenceTable.NewColumn FROM @v_tblname INNER JOIN ReferenceTable ON ReferenceTable.OldColumn =@v_tblname.@v_existing_column'
Print @SQLString
EXECUTE sp_executesql @SQLString
,N'@v_tblname NVARCHAR(50)'
,N'@v_new_column NVARCHAR(50)'
,N'@v_existing_column NVARCHAR(50)'
,@v_tblname, @v_new_column, @v_existing_column
FETCH NEXT FROM TblCur INTO @v_tblname, @v_existing_column, @v_new_column, @v_key
END -- End of Fetch
CLOSE TblCur
DEALLOCATE TblCur
答案 0 :(得分:0)
这根本不会像这样工作。您不能将表名作为动态sql中的参数传递。您必须正确构建动态SQL。我喜欢你试图使用参数化的SQL但在这种情况下它是不可能的。在使用sp_前缀之前,还需要阅读本文。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix
使用连接进行更新时,您需要更新别名而不是表名。它有时会混淆要更新哪一行。我还使用QUOTENAME包装了所有对象名称,以防它们有空格或其他具有挑战性的名称。
您还有一个@v_key变量,但它从未在您的更新语句中使用过。我怀疑你想要那个,但我真的不知道。
我显然无法接近测试,但这应该非常接近。
ALTER PROCEDURE sp_Update(@IN_TABLENAME VARCHAR)
AS
DECLARE @v_tblname NVARCHAR(50),
@v_existing_column NVARCHAR(50),
@v_new_column NVARCHAR(50),
@v_key INTEGER,
@SQLString NVARCHAR(2000)
DECLARE TblCur CURSOR FOR
SELECT TblNAME, CURR_COLUMN, NEW_COLUMN, Seq_KEY FROM CONTROL_Table
WHERE
TblNAME=@IN_TABLENAME
OPEN TblCur FETCH NEXT FROM TblCur
INTO @v_tblname, @v_existing_column, @v_new_column, @v_key
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString = N'UPDATE ut SET ' + QUOTENAME(@v_new_column) + ' = ReferenceTable.NewColumn '
+ 'FROM ' + QUOTENAME(@v_tblname) + ' ut '
+ 'INNER JOIN ReferenceTable ON ReferenceTable.OldColumn = ut.' + QUOTENAME(@v_existing_column)
Print @SQLString
EXECUTE sp_executesql @SQLString
FETCH NEXT FROM TblCur INTO @v_tblname, @v_existing_column, @v_new_column, @v_key
END -- End of Fetch
CLOSE TblCur
DEALLOCATE TblCur