簡體   English   中英

查找具有指定列名的所有表並將值設置為NULL

[英]Find all tables with specified column name and set values to NULL

我知道如何在數據庫中查找具有指定列名的所有表:

SELECT  TABLE_NAME
        , COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   COLUMN_NAME LIKE '%Name%'

結果,我得到一個帶有TABLE_NAMECOLUMN_NAME的表。 是否可以將查詢接收的列中的所有值都設置為NULL?

sp_MSforeachtable廣泛使用。 它遍歷每個表並執行指定的語句。 [?]是表名的替身。 請先備份數據庫,然后再嘗試此操作。

EXEC sp_MSforeachtable 'UPDATE [?] SET SomeColumn = NULL'

使用Dynamic Sql 嘗試這個。

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += 'update ' + TABLE_NAME + ' set ' + COLUMN_NAME + '= NULL '
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  COLUMN_NAME LIKE '%Name%'

--print @sql
EXEC Sp_executesql @sql 

您不能在查詢中定義每個表和每個列。 為此,您需要動態選擇表和列並執行它。 您可以動態使用游標

DECLARE @TableName VARCHAR(100)=''
DECLARE @ColumnName VARCHAR(100)
DECLARE @PreviousTableName VARCHAR(100)='' 
DECLARE @PreviousColumnName NVARCHAR(MAX)=''
DECLARE @ROWNO INT
DECLARE @MAXCOUNT INT

DECLARE @UPDATESQL NVARCHAR(MAX)
DECLARE @COLSSQL NVARCHAR(MAX)


-- Here you declare which all columns you need to loop in Cursor
DECLARE CUR CURSOR FOR 
SELECT  TABLE_NAME, COLUMN_NAME
-- Find Row number for each table
,ROW_NUMBER() OVER(PARTITION BY TABLE_NAME ORDER BY COLUMN_NAME) RNO,
-- Gets the count of columns in each table
COUNT(COLUMN_NAME) OVER(PARTITION BY TABLE_NAME) CNT     
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '%TE%'
ORDER BY TABLE_NAME, COLUMN_NAME 

OPEN CUR


FETCH NEXT FROM CUR 
INTO @TableName,@ColumnName,@ROWNO,@MAXCOUNT

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @PreviousColumnName = @PreviousColumnName + @ColumnName + '=NULL,'

    -- If current row is last record of the table in the loop
    IF(@ROWNO = @MAXCOUNT)
    BEGIN
        SET @UPDATESQL = 'UPDATE '+@TableName+' SET ' + @PreviousColumnName
        SET @UPDATESQL = LEFT(@UPDATESQL, LEN(@UPDATESQL) - 1)
        EXEC SP_EXECUTESQL @UPDATESQL
        SET @PreviousColumnName = ''            
    END

    -- Fetches next record and increments the loop
    FETCH NEXT FROM CUR 
    INTO @TableName,@ColumnName,@ROWNO,@MAXCOUNT
END 

CLOSE CUR;
DEALLOCATE CUR;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM