在SQL Server的INT列中插入空字符串
在SQL Server的INT列中插入空字符串,sql,sql-server-2008,insert,numeric,Sql,Sql Server 2008,Insert,Numeric,SAMPLE表只有一列ID类型为int,默认为空 在Oracle中,当我这样做时: insert into SAMPLE (ID) values (''); 新记录将添加空白值。但在SQL Server 2008中,当我运行相同的insert语句时,新记录的值为0 有没有办法强制SQL Server 2008将空白字符串默认为NULL而不是0(对于数字类型的列)?使用NULL insert into SAMPLE (ID) values (NULL); 不能在int列中插入“字符串”。甲
SAMPLE
表只有一列ID
类型为int
,默认为空
在Oracle中,当我这样做时:
insert into SAMPLE (ID) values ('');
新记录将添加空白值。但在SQL Server 2008中,当我运行相同的insert
语句时,新记录的值为0
有没有办法强制SQL Server 2008将空白字符串默认为NULL而不是0(对于数字类型的列)?使用NULL
insert into SAMPLE (ID) values (NULL);
不能在int列中插入“字符串”。甲骨文一定是在帮你处理这件事 如果您需要的话,请尝试插入NULL
insert into SAMPLE (ID) values (NULL);
还有一个选择
insert into SAMPLE (ID) values (DEFAULT)
另一个想法如何-定义一个新的概念 尽管您正在尝试插入一个字符串,但使用此操作将“截获”,空字符串将替换为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语句是在应用程序的许多地方重复使用的存储过程的一部分(或者,可能是始终由客户机代码的同一部分构造的批处理),并且插入的值是作为字符串参数传递的数字,您可以这样修改INSERT:
INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
我知道空值会起作用。但我必须修改很多与Oracle完美配合的代码,更不用说大量测试了(我不认为不修改代码就可以这样做。我知道中没有任何设置会使SQL Server将空字符串视为NULL。插入样本(ID)值('5');我得到ID=5,Oracle和SQL Server正在执行相同的插入样本(ID)值('');我认为SQL server的ID=0,Oracle中的OracleIn的“”空字符串和
Null
是一致的。这也会将所有零转换为Null
。首先将空字符串转换为零,这样ID
ininserted
是正确的数据类型,然后比较当ID=”时,然后是Null
对字符串文本进行另一次隐式转换,从'
到0
,这样当ID=0然后为NULL时,你就可以有效地执行。@MartinSmith好的一点,我没有注意到。我想不出解决这个问题的办法。我将在这里留下这个答案,以防这对OP的情况是可以接受的。@MartinSmith我编辑过。@MartinSmith包括你的观点。我想知道为什么没有其他人提出这个建议,如果它这么简单的话!谢谢你一如既往的宝贵见解。