0

您好,我目前正在为客户转换数据。我正在导入“|” SQL Server 2008 R2 中的分隔文本文件。客户已使用“01/01/0001”作为空白日期;但是,当我导入此值时,SQL Server 将此日期视为“01/01/2001”。

我最初的工作是导入为 char(10),然后在导入后进行更改。这对某些人有用,但我发现它并不总是有效!!!!令人沮丧....

我需要搜索值为“01/01/2001”的所有数据类型日期

4

1 回答 1

2

如果您只想将所有实例更新为NULL(这比某些魔术值要好得多01/01/0001),那么您可以说:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
UPDATE ' 
  +   QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  + ' SET ' + QUOTENAME(name) + ' = NULL
      WHERE ' + QUOTENAME(name) + ' = ''20010101'';'
FROM sys.columns
WHERE system_type_id = 40; -- date

PRINT @sql;
--EXEC sp_executesql @sql;

现在,我怀疑这不起作用的情况是数据类型实际上date不是datetime/的情况smalldatetime。所以你可能想要这个:

WHERE system_type_id IN (40,42,43,58,61);

如果您仍想使用此 hocus pocus,您可以更改此行:

  + ' SET ' + QUOTENAME(name) + ' = NULL

对此:

  + ' SET ' + QUOTENAME(name) + ' = ''00010101''

datetime但是如果列是/ ,这将不起作用smalldatetime

请注意,您应该始终使用YYYYMMDD. 这种MM/DD/YYYY东西是一个坏习惯,容易在堆栈上下产生误解

于 2013-03-25T16:54:44.557 回答