【问题标题】:Sql Server: update every 'null' string record in databaseSql Server:更新数据库中的每个“空”字符串记录
【发布时间】:2017-05-16 13:49:16
【问题描述】:

我在将数据迁移到我的新 sql server 数据库时犯了一个错误:几乎每条应该为空的记录现在都有一个“空”字符串值。

是否有一种相当快速的方法来更新整个数据库并用真正的空值替换每个“空”记录?

我正在尝试这样的事情:

 SELECT ' update ' + TABLE_SCHEMA + '.' + TABLE_NAME + 'set value = null 
 where value = 'NULL''
 FROM INFORMATION_SCHEMA.TABLES 

但我正在寻找一些关于如何迭代每个表中的每一列的建议。

【问题讨论】:

  • 如果这是一个新数据库,在修复过程之后,简单地删除数据库并重新导入可能会更容易。这当然是在您的测试系统上,对吧??
  • @PrabhatG 这是用 sql server 标记的。您建议的副本是 postgre,它们不是一回事。
  • 我不想删除数据库,因为我已经使用批量插入从 db2 导入数据,这是一个相当长的过程;我也尝试使用 ssma 进行自动数据迁移,但无法正常工作
  • 请注意,在 TSQL 中,要在变量中获取单引号,您需要使用单引号对其进行转义。 F.e. set @v = '... where value=''NULL'';';

标签: sql-server null


【解决方案1】:

您可以使用查询为您创建 sql。像这样的东西。如果您需要处理 text 和 ntext,则必须在 sys.types 中查找它们的 type_id 值。我没有包括它们,因为它们应该首先被使用。

select 'update ' + QUOTENAME(s.name) + '.' + quotename(t.name) + 
    ' set ' + QUOTENAME(c.name) + ' = NULL where '
    + QUOTENAME(c.name) + ' = ''NULL'''
from sys.tables t
join sys.columns c on c.object_id = t.object_id
join sys.schemas s on s.schema_id = t.schema_id
where c.system_type_id in
(
    167 --varchar
    , 175 --char
    , 231 --nvarchar
    , 239 --nchar
)

【讨论】:

  • 从这个问题中获得灵感stackoverflow.com/questions/25780297/… 我想出了这个:` SELECT ' update ' + table_schema + '。' +table_name + ' set '+ COLUMN_NAME +' = null where '+ COLUMN_NAME + '= ''NULL''' FROM( select table_schema,table_name,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar') c `,有区别吗有你的答案吗?
  • @Argentina 它只会更新 varchar 列,而不是 char、nchar 和 nvarchar 列。视图也包含在 INFORMATION_SCHEMA.COLUMNS 中。
  • 除了您的代码只会更新 varchar 的区别之外,您可能会或可能不会正确地获取架构。 INFORMATION_SCHEMA 视图并不总是可靠的。请注意,甚至文档都建议您不应该使用它。 docs.microsoft.com/en-us/sql/relational-databases/…
【解决方案2】:

您可以在夜间运行以下查询。它将为每个字符串类型列创建一个更新语句,而不是执行所有语句。

declare @sql nvarchar(max) = ''

select @sql = @sql + 'update '+ t.name + ' set '+ c.name + ' = null where '+ c.name + '=''null''' +char(13) + char(10)
from sys.tables t
join sys.columns c on t.object_id = c.object_id
join sys.types ty on c.system_type_id = ty.system_type_id
where ty.name like '%char'

exec sp_executesql @sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2013-01-27
    • 2017-07-27
    • 2011-07-16
    相关资源
    最近更新 更多