SQL Server:如何根据查询返回的列更新表?

时间:2019-07-15 04:26:29

标签: sql sql-server sql-update

我有一个查询,可以使用给定的“关键字”搜索来查找我所有数据库中的所有表:

CREATE TABLE #tblTEMP1
(
     DBaseName VARCHAR(100), 
     TableSchema VARCHAR(50), 
     TableName VARCHAR(100), 
     ColumnName VARCHAR(100), 
     DataType VARCHAR(100),
     CharMaxLength VARCHAR(100) 
)

EXEC sp_MSForEachDB @command1 = 'USE [?];
    INSERT INTO #tblTEMP1 
        SELECT
            Table_Catalog, Table_Schema, Table_Name,
            Column_Name, Data_Type, Character_Maximum_Length
        FROM 
            INFORMATION_SCHEMA.COLUMNS 
        WHERE 
            COLUMN_NAME like ''%password%'''

SELECT * FROM #tblTEMP1

DROP TABLE #tblTEMP1

如何利用上面的查询实际更改/ UPDATE返回的列?是的,我正在尝试使用单个值来标准化每个“用户”表的密码列。

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么下一种方法可能会有所帮助。它基于您的声明,使用sp_MSForEachDB未记录的过程。不需要临时表,只需生成并执行动态语句即可。

EXEC sp_MSForEachDB @command1 = '
    IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'') BEGIN
        USE [?];

        DECLARE @stm nvarchar(max)
        SET @stm = N''''

        SELECT @stm = CONCAT(
            @stm,
            N''UPDATE '',
            QUOTENAME(TABLE_SCHEMA),
            N''.'',
            QUOTENAME(TABLE_NAME),
            N'' SET '',
            QUOTENAME(COLUMN_NAME),
            N'' = ''''your_varchar_value''''; ''
        )
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE COLUMN_NAME LIKE ''password%''

        PRINT @stm
        EXEC (@stm)
    END
'

答案 1 :(得分:0)

使用sys.databases获取所有数据库的列表。

  GO

  select * into #dbname from (SELECT * FROM sys.databases) as db

  select * from #dbname

  GO

然后,您可以使用cursor遍历每个数据库并完成任务。