您好,我目前正在为客户转换数据。我正在导入“|” SQL Server 2008 R2 中的分隔文本文件。客户已使用“01/01/0001”作为空白日期;但是,当我导入此值时,SQL Server 将此日期视为“01/01/2001”。
我最初的工作是导入为 char(10),然后在导入后进行更改。这对某些人有用,但我发现它并不总是有效!!!!令人沮丧....
我需要搜索值为“01/01/2001”的所有数据类型日期
您好,我目前正在为客户转换数据。我正在导入“|” SQL Server 2008 R2 中的分隔文本文件。客户已使用“01/01/0001”作为空白日期;但是,当我导入此值时,SQL Server 将此日期视为“01/01/2001”。
我最初的工作是导入为 char(10),然后在导入后进行更改。这对某些人有用,但我发现它并不总是有效!!!!令人沮丧....
我需要搜索值为“01/01/2001”的所有数据类型日期
如果您只想将所有实例更新为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
东西是一个坏习惯,容易在堆栈上下产生误解。