一个SAMPLE
表只有一列ID
type int
,默认为 null。
当我这样做时,在 Oracle 中:
insert into SAMPLE (ID) values ('');
新记录添加了空白值。但在 SQL Server 2008 中,当我运行相同的insert
语句时,新记录的值为 0。
有没有办法强制 SQL Server 2008 默认空白字符串为 NULL 而不是 0(对于数字类型的列)?
一个SAMPLE
表只有一列ID
type int
,默认为 null。
当我这样做时,在 Oracle 中:
insert into SAMPLE (ID) values ('');
新记录添加了空白值。但在 SQL Server 2008 中,当我运行相同的insert
语句时,新记录的值为 0。
有没有办法强制 SQL Server 2008 默认空白字符串为 NULL 而不是 0(对于数字类型的列)?
假设您的 INSERT 语句是在您的应用程序的许多地方重复使用的存储过程的一部分(或者,可能是始终由客户端代码的同一部分构造的批处理)并且插入的值是作为传递的数字字符串参数,您可以像这样修改 INSERT:
INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
请改用 NULL。
insert into SAMPLE (ID) values (NULL);
另一个想法怎么样 - 定义一个INSTEAD OF INSERT 触发器。
尽管您试图插入一个字符串,但操作被“拦截”,空字符串被 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
另一种选择
insert into SAMPLE (ID) values (DEFAULT)
您不能将“字符串”插入 int 列。甲骨文一定只是为您处理。
如果这是您需要的,请尝试插入 NULL 。
insert into SAMPLE (ID) values (NULL);