将空字符串插入 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 列的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为xml并插入Sql Server

Python和SQL:用SQL的“Null”值替换DataFrame的空字符串,以将数据插入数据库中而不会出现格式错误[重复]

将空字符串绑定到 pdo 准备好的查询时 HY104 Sql server 错误

sql server 里类似replace的字符串子串删除

SQL Server 插入多行并增加一个 int 列

尝试将字符串插入 SQL Server 时出现问题