2013-06-03 59 views
0

我需要編寫一個更新語句,它將在每個字段中將所有不需要的值替換爲NULL。我正在使用此更新聲明。如何爲列名創建變量

UPDATE TableName 
SET ColumnName = replace(ColumnName, 'what to replace', NULL) 
WHERE ColumnName = 'what to replace' 
GO 

我需要創建一個變量,將採取INFORMATION_SCHEMA.COLUMNS數據和改變變量對每個列名在時間和每一列運行UPDATE語句來代替不必要的字符NULL

回答

1

您可以方便的光標做到這一點(假設SQL Server的):

DECLARE @Iterator varchar(55) 
DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable 
DECLARE xyz CURSOR 
FOR 
--Select stuff to iterate over 
SELECT c.name ColumnName 
FROM sys.columns c INNER JOIN 
    sys.tables t ON c.object_id = t.object_id INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id 
WHERE t.name = 'table' 
OPEN xyz  
FETCH NEXT FROM xyz 
INTO @Iterator  
WHILE @@FETCH_STATUS = 0 
BEGIN 
--Do stuff 
SET @strSQL = ' 
      UPDATE TableName 
      SET '[email protected]+' = NULL 
      WHERE '[email protected]+' = ''junk'' 
      GO' 
PRINT (@strSQL)  
    FETCH NEXT FROM xyz 
    INTO @Iterator  
END 
CLOSE xyz 
DEALLOCATE xyz 
GO 

實際執行此更新要更改打印(@strSQL)給EXEC(@strSQL),PRINT第一次使確保按照您的意願閱讀報表。

更新:要遍歷每個表/列,這將工作爲每個表打印出遊標,但不能執行外部遊標。

DECLARE @Iterator varchar(55) 
DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable  
DECLARE xyz CURSOR 
FOR 
--Select stuff to iterate over 
SELECT DISTINCT t.name TableName 
FROM sys.tables t INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id 
OPEN xyz  
FETCH NEXT FROM xyz 
INTO @Iterator  
WHILE @@FETCH_STATUS = 0 
BEGIN  
--Do stuff 
SET @strSQL = 'DECLARE @Iterator varchar(55) 
       DECLARE @strSQL varchar(8000) -- for dynamic sql set then exec variable 
       DECLARE xyz CURSOR 
       FOR 
       --Select stuff to iterate over 
       SELECT c.name ColumnName 
       FROM sys.columns c INNER JOIN 
        sys.tables t ON c.object_id = t.object_id INNER JOIN 
        sys.schemas s ON t.schema_id = s.schema_id 
       WHERE t.name = '''[email protected]+''' 
       OPEN xyz  
       FETCH NEXT FROM xyz 
       INTO @Iterator  
       WHILE @@FETCH_STATUS = 0 
       BEGIN 
       --Do stuff 
       SET @strSQL = '' 
          UPDATE '[email protected]+' 
          SET ''[email protected]+'' = NULL 
          WHERE ''[email protected]+'' = ''''junk'''' 
          GO'' 
       PRINT (@strSQL)  
        FETCH NEXT FROM xyz 
        INTO @Iterator  
       END 
       CLOSE xyz 
       DEALLOCATE xyz 
       GO 
' 
PRINT (@strSQL) 
    FETCH NEXT FROM xyz 
    INTO @Iterator  
END  
CLOSE xyz 
DEALLOCATE xyz 
GO 
+0

工作完美,這正是我想要的。我還可以添加一些可以改變表名的東西嗎?所以它會選擇表名,然後選擇其中的所有列,然後拿下一個表等等。?那是另一個光標? –

+0

你確實可以把它嵌套在另一個遊標中,它會讓一些複雜的動態sql嵌套在遊標內部,但如果我有時間的話,我會用它來保持跟蹤。它會是數據庫中的每個表,還是它們的一個子集? –

+0

更新了數據庫中每個表中每列的版本答案。在外部遊標'WHERE t.name'中使用某些WHERE條件可能明智一些,比如'%something%' –