Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server的INT列中插入空字符串_Sql_Sql Server 2008_Insert_Numeric - Fatal编程技术网

在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
in
inserted
是正确的数据类型,然后比较
当ID=”时,然后是Null
对字符串文本进行另一次隐式转换,从
'
0
,这样当ID=0然后为NULL时,你就可以有效地执行
。@MartinSmith好的一点,我没有注意到。我想不出解决这个问题的办法。我将在这里留下这个答案,以防这对OP的情况是可以接受的。@MartinSmith我编辑过。@MartinSmith包括你的观点。我想知道为什么没有其他人提出这个建议,如果它这么简单的话!谢谢你一如既往的宝贵见解。