Gre*_*ray 7 sql t-sql sql-server sql-server-2005 sql-update
我们有一个包含大量宽表(每个40-80列)的数据库,并且发现了一个将NULL值引入大约500条记录的错误.NULL值可以出现在任何列中(都是整数列,请参见下图)但这些NULL值导致我们的报告系统之一无法轻易更改.我们需要用特定的静态值(在本例中为99)替换NULL值,但由于这个更改必须基于每列超过250个不同的列,我宁愿不编写更新每个列的单个TSQL脚本一个人.
我的大脑现在太过于思考一个聪明的解决方案,所以我的问题是如何使用简单易读的SQL查询在表(或更好的多个表)上的所有列上执行此任务.我可以使用WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ...每个表的链或甚至每个表的AdministrationID号来容易地隔离记录,但是当更新为where子句是每行而不是每列时,这个技巧将不起作用.有什么建议?
以下是一个示例查询,显示了来自4个不同表的一些记录:

OMG*_*ies 22
没有任何约定 - 如果您只想处理各列为NULL的记录,则需要使用:
WHERE Answer_1 IS NULL
OR Answer_2 IS NULL
OR ...
Run Code Online (Sandbox Code Playgroud)
但您可以在UPDATE语句中使用它:
UPDATE YOUR_TABLE
SET col1 = COALESCE(col1, 99),
col2 = COALESCE(col2, 99),
col3 = ...
Run Code Online (Sandbox Code Playgroud)
逻辑是,只有当列值为NULL时,该值才会更新为99,因为COALESCE的工作方式 - 返回第一个非NULL值(处理从左到右提供的列表).
小智 5
只需为每个表轮询 sys.columns 表并创建一些动态 sql ......这是蛮力,但它使您不必写出所有的 t-sql。
例如:
DECLARE @TABLENAME AS VARCHAR(255)
SET @TABLENAME = 'ReplaceWithYourTableName'
SELECT 'UPDATE ' + @TableName + ' SET ' + CAST(Name AS VARCHAR(255)) + ' = 99
WHERE ' + CAST(Name AS VARCHAR(255)) + ' IS NULL'
FROM sys.columns
WHERE object_id = OBJECT_ID(@TABLENAME)
AND system_type_id = 56 -- int's only
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43871 次 |
| 最近记录: |