我试图将“Null”(逐字地)插入到存储过程的参数中。出于某种原因,SqlServer似乎认为我的意思是NULL而不是“Null”。如果我做一个检查将“null”(字面上)插入存储过程参数
IF @LastName IS NULL // Test: Do stuff
然后它绕过,因为该参数不为空。
但是当我做:
INSERT INTO Person (<params>) VALUES (<stuff here>, @LastName, <more stuff here>); // LastName is 'Null'
它炸弹出来说名字不接受空值。 我会非常讨厌拥有这个姓氏,但有人会......并且它正在轰炸应用程序。我们使用SubSonic 2.0(是的,这是相当古老的,但升级是痛苦的)作为我们的DAL,并通过它,我看到它确实创造了正确的参数(我所知道的)。
我试着创建一个临时表,看看我是否可以手动复制它,但它似乎工作得很好。这里是我创建的示例:
DECLARE @myval VARCHAR(50)
SET @myval = 'Null'
CREATE TABLE #mytable(name VARCHAR(50))
INSERT INTO #mytable VALUES (@myval)
SELECT * FROM #mytable
DROP table #mytable
有关如何解决此问题的任何想法?
编辑:设置LastName的方法是this - myPerson.LastName = textBoxLastName.Text;
编辑:使用SqlServer Profiler时,我看到它发送空。有两件事很奇怪,我想知道为什么我的“IF @ lastName IS NULL”没有被触发......但是现在我必须进一步观察SubSonic,看看最后一刻我是不知道的。我会进一步调查并报告。
编辑:唯一的约束是默认值''。
编辑:好吧,我已经证实它是SubSonic试图发挥聪明。
if (param.ParameterValue == null || Utility.IsMatch(param.ParameterValue.ToString(), "null"))
使用Profiler的好主意,我完全忘了这一点。最后编辑:值得注意的是,在将来的参考文献中,SubSonic会在数据提供者的最后一分钟(在我的情况下是SqlDataProvider)中替换它。在调用Execute Scalar的DataService.cs中,参数尚未调整。当它为DataProvider运行ExecuteScalar时会进行调整,这是一个抽象类(因此Postgre和Oracle将分别拥有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams是我的。
是否有关于该列,它不允许文本值“空”的任何约束要插入? – shahkalpesh 2010-04-13 18:35:11
还有一件事 - 在调用存储过程之前,是否使用字符串文字Null显式设置参数? – shahkalpesh 2010-04-13 18:41:46
我怀疑SubSonic可能是快捷方式并将其更改为NULL(实际上是NULL而不是'Null')。您是否使用SQL Profiler检查了实际的插入文本? – 2010-04-13 18:43:16