sql - 使用游标和变量更新表

标签 sql sql-server sql-update cursor

我想使用游标来更新我拥有的表,但我没有任何运气。这就是为什么我想使用一个游标,这样我就不必花费数小时编写 100 条更新语句。这是我当前的代码:

DECLARE @COLUMN_NAME VARCHAR(10)
DECLARE A_Cursor CURSOR
    FOR
        SELECT column_name
        FROM TPP_DB.INFORMATION_SCHEMA.columns
        WHERE table_name = 'Master File'
            AND column_name LIKE 'F%'
            AND LEN(column_name) <= 4
            AND column_name NOT IN ('F61', 'F62') --FOR UPDATE OF [TPP_DB].[dbo].[Master File]

OPEN A_Cursor
FETCH NEXT FROM A_Cursor INTO @COLUMN_NAME

WHILE @@fetch_status = 0
BEGIN

    PRINT @COLUMN_NAME

    UPDATE TPP_DB.dbo.[Master File]
    SET @COLUMN_NAME = NULL
    WHERE @COLUMN_NAME = ''

    FETCH NEXT FROM A_Cursor INTO @COLUMN_NAME

END

CLOSE A_Cursor
DEALLOCATE A_Cursor

我遇到的主要问题是我的变量@COLUMN_NAME没有加载到更新语句中,但是当我打印它时,我得到了正确的值。我希望将变量读入 SETWHERE 子句,以便我可以立即更新我需要的所有表。任何其他建议也很棒。

最佳答案

你需要动态sql,比如......

DECLARE @Sql NVARCHAR(MAX) , @COLUMN_NAME SYSNAME;
DECLARE A_Cursor CURSOR FOR 

SELECT COLUMN_NAME 
FROM TPP_DB.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Master File' 
    AND COLUMN_NAME LIKE 'F%' 
    AND LEN(COLUMN_NAME) <= 4 
    AND COLUMN_NAME NOT IN ('F61','F62') --FOR UPDATE OF [TPP_DB].[dbo].[Master File]

OPEN A_Cursor
FETCH NEXT FROM A_Cursor  INTO @COLUMN_NAME

WHILE @@FETCH_STATUS = 0
BEGIN 

PRINT @COLUMN_NAME

SET @Sql = N' UPDATE TPP_DB.dbo.[Master File]
               SET ' + QUOTENAME(@COLUMN_NAME) + ' = NULL
              WHERE ' + QUOTENAME(@COLUMN_NAME) + ' = '''' '

  Exec sp_executesql @Sql

FETCH NEXT FROM A_Cursor INTO @COLUMN_NAME

END


CLOSE A_Cursor
DEALLOCATE A_Cursor

关于sql - 使用游标和变量更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34951007/

相关文章:

mysql - MySQL 中的 ROW_NUMBER()

mysql 匹配通配符

mysql - 如果某些员工可以获得相同的薪水,则获得第二高的薪水

mysql - 根据多个条件获取结果

sql - 在此 SQL 查询中使用 'Not In' 有什么问题?

c# - 在 Fluent NHibernate 中自动截断字符串

mysql - 更新加入 -> 插入 NULL

sql-server - 在 SQL Server 中使用括号 [ () ] 和连字符 ( - ) 格式化多个电话号码

javascript - 使用文本框使用php表单更新MySQL数据库

php - 仅当值更改时才使用 PHP 更新 MySQL 数据库