具有相同标准的一个SQL表上的全局更新(所有行)

时间:2015-01-30 10:13:15

标签: sql sql-server-2008

有没有办法在表格的每一列中运行它:

UPDATE dbo.stage_a
SET Statement_Name= NULL
WHERE Statement_Name='""';

我想在数据导入后整理一下。

3 个答案:

答案 0 :(得分:1)

Dynamic queryInformation_schema.columns。试试这个。

DECLARE @cols NVARCHAR(max)='UPDATE dbo.stage_a set '

SELECT @cols += COLUMN_NAME + '=case when ' + COLUMN_NAME
                + ' = '""' then null else '+COLUMN_NAME+' end,'
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'stage_a'
       AND TABLE_SCHEMA = 'dbo'

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

PRINT @cols

EXEC Sp_executesql @cols 

答案 1 :(得分:0)

UPDATE Customers
SET ContactName='Alfred Schmidt', City='Hamburg'
WHERE CustomerName='Alfreds Futterkiste';

与此示例一样,您应指定所有列。(以逗号分隔)

如果要用NULL替换所有列,为什么不删除行:

DELETE FROM Customers
WHERE CustomerName='Alfreds Futterkiste' 

答案 2 :(得分:0)

您需要先使用INFORMATION_SCHEMA.COLUMNS

获取所有列列表
   DECLARE @tableName varchar(10)
   SET @tableName = 'mm'

   DECLARE @sql VARCHAR(MAX)
   SET @sql = ''

   SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = NULL WHERE ' + c.name + '= ''';'
   FROM sys.columns c
   INNER JOIN sys.tables t ON c.object_id = t.object_id
   INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
   WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar')

  EXEC (@sql)

未经测试的查询可能需要根据您的需要进行调整