web-dev-qa-db-ja.com

SQL ServerのINT列に空の文字列を挿入する

SAMPLEテーブルには、タイプIDの列intが1つだけあり、デフォルトはnullです。

私が行うときのOracleでは:

  insert into SAMPLE (ID) values ('');

新しいレコードは空白の値で追加されます。しかし、SQL Server 2008では、同じinsertステートメントを実行すると、新しいレコードの値が0になります。

SQL Server 2008でデフォルトの空白文字列を0ではなくNULLに強制する方法(数値型の列の場合)はありますか?

12
user1793297

代わりにNULLを使用してください。

insert into SAMPLE (ID) values (NULL);
6
Mikael Eriksson

INSERTステートメントが、アプリケーションの多くの場所で再利用されるストアドプロシージャの一部である(または、おそらくクライアントコードの同じ部分によって常に構築されるバッチである)と想定し、挿入された値は、文字列引数の場合、INSERTを次のように変更できます。

INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
6
Andriy M

別のアイデアはどうですか- INSTEAD OF INSERT Trigger を定義します。

文字列を挿入しようとしているという事実にもかかわらず、これにより操作は「インターセプト」され、空の文字列はNULLに置き換えられ、挿入は成功します。

このトリガーをテーブルに定義すると、他の変更を加えずに、引き続き空の文字列を挿入できます。

編集:Martin Smithが指摘するように、これは事実上0(intとしての空の文字列に相当)との比較であり、このテーブルに0を格納します。私はあなたの状況に受け入れられる場合に備えて、この答えをここに残します-それでも、またはすべてのクエリをやり直してください!

CREATE TRIGGER EmptyStringTrigger
ON [SAMPLE]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO [SAMPLE](ID)
      SELECT CASE
               WHEN ID = '' THEN NULL
               ELSE ID
             END
      FROM   inserted
  END

SQL Fiddle例

4
Bridge

'string'をint列に挿入することはできません。オラクルはあなたのためにそれを処理しなければなりません。

必要な場合は、NULLを挿入してみてください。

insert into SAMPLE (ID) values (NULL);
0
Jarod Elliott

もう1つのオプション

insert into SAMPLE (ID) values (DEFAULT)
0