2010-04-13 44 views
1

我试图将“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是我的。

+1

是否有关于该列,它不允许文本值“空”的任何约束要插入? – shahkalpesh 2010-04-13 18:35:11

+0

还有一件事 - 在调用存储过程之前,是否使用字符串文字Null显式设置参数? – shahkalpesh 2010-04-13 18:41:46

+1

我怀疑SubSonic可能是快捷方式并将其更改为NULL(实际上是NULL而不是'Null')。您是否使用SQL Profiler检查了实际的插入文本? – 2010-04-13 18:43:16

回答

1

值得一提的,皮毛备查,即亚音速取代这在数据提供者的最后一分钟(在我的情况的SqlDataProvider)。在调用Execute Scalar的DataService.cs中,参数尚未调整。当它为DataProvider运行ExecuteScalar时会进行调整,这是一个抽象类(因此Postgre和Oracle将分别拥有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams是我的。

0

请试试这个:

糟糕...我完全误解了这个问题。我认为应该在数据库列中设置一些约束条件。请尝试直接在数据库中写入插入查询,看看它是否弹出。

我想这和它的炸弹如预期:

DECLARE @myval VARCHAR(50) 
SET @myval = 'null' 
CREATE TABLE #mytable(name VARCHAR(50) NULL CHECK (name <> 'NULL')) 
INSERT INTO #mytable VALUES (@myval) 
SELECT * FROM #mytable WHERE name is not null 
DROP table #mytable 

HTH