SQL Server存储过程,使用游标更新动态表

时间:2016-03-10 16:21:21

标签: sql-server stored-procedures

我是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

1 个答案:

答案 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