我想使用游标来更新我拥有的表,但我没有任何运气。这就是为什么我想使用一个游标,这样我就不必花费数小时编写 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
没有加载到更新语句中,但是当我打印它时,我得到了正确的值。我希望将变量读入 SET
和 WHERE
子句,以便我可以立即更新我需要的所有表。任何其他建议也很棒。
最佳答案
你需要动态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/