将空字符串插入到SQL Server的INT列中

时间:2012-11-02 05:15:33

标签: sql sql-server-2008 insert numeric

SAMPLE表只有一列ID int,默认为null。

在我做Oracle的时候:

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

新记录添加了空白值。但是在SQL Server 2008中,当我运行相同的insert语句时,新记录的值为0.

有没有办法强制SQL Server 2008将空字符串默认为NULL而不是0(对于数字类型的列)?

5 个答案:

答案 0 :(得分:6)

改为使用NULL。

insert into SAMPLE (ID) values (NULL);

答案 1 :(得分:5)

假设您的INSERT语句是在应用程序的许多位置重用的存储过程的一部分(或者,可能是批处理总是由客户端代码的相同部分构造)并且插入的值是一个数字作为字符串参数传递,您可以像这样修改INSERT:

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

答案 2 :(得分:3)

另一个想法怎么样 - 定义一个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 example

答案 3 :(得分:0)

您无法将“字符串”插入到int列中。 Oracle必须正好为您处理。

如果您需要,请尝试插入NULL。

insert into SAMPLE (ID) values (NULL);

答案 4 :(得分:0)

还有一个选择

insert into SAMPLE (ID) values (DEFAULT)