2016-01-22 55 views
2

我想使用遊標更新我擁有的表,但我沒有任何運氣。這就是爲什麼我想使用一個遊標,我不必花費數小時來編寫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子句中,以便我可以一次更新所需的所有表。任何其他建議也會很棒。

回答

1

您需要動態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 
+0

非常感謝你的工作。 –

1
USE TPP_DB 
GO 

DECLARE @SQL NVARCHAR(MAX) 

SELECT @SQL = (
    SELECT ' 
UPDATE ' + QUOTENAME(SCHEMA_NAME(o.[schema_id])) + '.' + QUOTENAME(o.name) + ' 
SET ' + QUOTENAME(c.name) + ' = NULL 
WHERE ' + QUOTENAME(c.name) + ' = ''''' 
    FROM sys.columns c 
    JOIN sys.objects o ON c.[object_id] = o.[object_id] 
    WHERE o.name = 'MasterFile' 
     AND c.name LIKE 'F%' 
     AND c.name NOT IN ('F61','F62') 
     AND o.[type] = 'U' 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 

PRINT @SQL 
EXEC sys.sp_executesql @SQL 

輸出 -

UPDATE [dbo].[tbl] 
SET col = NULL 
WHERE col = '' 
... 
+0

這工作很順利,我只想寧願有,在運行一切東西而不必從輸出中複製和粘貼代碼。 –

+0

只需取消註釋'sp_executesql';) – Devart

+0

噢。 *手適用於額頭* –