将空字符串插入 SQL Server 的 INT 列
Posted
技术标签:
【中文标题】将空字符串插入 SQL Server 的 INT 列【英文标题】:Insert empty string into INT column for SQL Server 【发布时间】:2012-11-02 05:15:33 【问题描述】:SAMPLE
表只有一列ID
类型为int
,默认为空。
当我这样做时在 Oracle 中:
insert into SAMPLE (ID) values ('');
新记录添加了空白值。但在 SQL Server 2008 中,当我运行相同的 insert
语句时,新记录的值为 0。
有没有办法强制 SQL Server 2008 默认空白字符串为 NULL 而不是 0(对于数字类型的列)?
【问题讨论】:
【参考方案1】:假设您的 INSERT 语句是在应用程序的许多地方重复使用的存储过程的一部分(或者,可能是始终由客户端代码的同一部分构造的批处理)并且插入的值是一个数字作为字符串参数传递,您可以像这样修改 INSERT:
INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
【讨论】:
【参考方案2】:改用 NULL。
insert into SAMPLE (ID) values (NULL);
【讨论】:
我知道 NULL 会起作用。但是我必须更改大量与 Oracle 完美配合的代码,更不用说大量的测试了。 :( 我认为你不能在不修改代码的情况下做到这一点。我知道没有任何设置会使 SQL Server 将空字符串视为 NULL。【参考方案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
【讨论】:
这也会将所有零转换为NULL
。首先将空字符串强制转换为零,因此inserted
中的ID
是正确的数据类型,然后您的比较WHEN ID = '' THEN NULL
对那里的字符串文字进行另一个从''
到0
的隐式强制转换,因此您正在有效地做WHEN ID = 0 THEN NULL
@MartinSmith 好点,我没有注意到。我想不出办法。我会在这里留下这个答案,以防 OP 的情况可以接受。
@MartinSmith 我已编辑以包含您的观点。在那里我想知道为什么没有其他人建议它,如果它那么简单!感谢您一如既往的宝贵见解。【参考方案4】:
您不能将“字符串”插入 int 列。甲骨文一定只是为您处理。
如果您需要,请尝试插入 NULL。
insert into SAMPLE (ID) values (NULL);
【讨论】:
插入样本(ID)值('5');我得到 ID=5,Oracle 和 SQL 服务器正在对 SAMPLE (ID) 值 ('') 执行相同的插入操作;我得到 SQL Server 的 ID=0 和 Oracle 的 '' 我相信在 Oracle 中空字符串和Null
是同义词。【参考方案5】:
更多选择
insert into SAMPLE (ID) values (DEFAULT)
【讨论】:
以上是关于将空字符串插入 SQL Server 的 INT 列的主要内容,如果未能解决你的问题,请参考以下文章
Python和SQL:用SQL的“Null”值替换DataFrame的空字符串,以将数据插入数据库中而不会出现格式错误[重复]