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 に答える