将“null”(字面意思)插入到存储过程参数中

时间:2010-04-13 18:30:43

标签: sql-server-2005 tsql subsonic subsonic2.0

我正在尝试将“Null”(字面意思)插入到存储过程的参数中。出于某种原因,SqlServer似乎认为我的意思是NULL而不是“空”。如果我检查

IF @LastName IS NULL // Test: Do stuff

然后绕过它,因为参数不为空。

但是当我这样做时:

INSERT INTO Person (<params>) VALUES (<stuff here>, @LastName, <more stuff here>); // LastName is 'Null'

它爆炸说LastName不接受空值。 我会非常讨厌拥有这个姓氏,但有人确实......而且它正在轰炸这个应用程序。我们正在使用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的方法是这样的 - myPerson.LastName = textBoxLastName.Text;

编辑:使用SqlServer Profiler时,我看到它发送的是null。有两件事很奇怪,我想知道为什么我的“IF @lastName IS NULL”没有被解雇......但是现在我必须进一步看看SubSonic,看看是否有什么东西在改变,我不知道。我会进一步调查并报告。

编辑:唯一的约束是默认值''。

编辑:好的,我已经确认它是SubSonic试图发挥智能。

 if (param.ParameterValue == null || Utility.IsMatch(param.ParameterValue.ToString(), "null"))

使用Profiler的好主意,我完全忘记了这一点。

最终编辑:值得一提的是,SubSonic会在数据提供程序的最后一刻(在我的案例中为SqlDataProvider)中替换它。在DataService.cs中,它调用Execute Scalar,参数尚未调整。它们在运行DataProvider的ExecuteScalar时会得到调整,这是一个抽象类(因此Postgre和Oracle都会有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams就是我的意思。

2 个答案:

答案 0 :(得分:1)

值得注意的是,未来的参考资料,SubSonic会在数据提供程序的最后一刻(在我的例子中为SqlDataProvider)中替换它。在DataService.cs中,它调用Execute Scalar,参数尚未调整。它们在运行DataProvider的ExecuteScalar时会得到调整,这是一个抽象类(因此Postgre和Oracle都会有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams就是我的意思。

答案 1 :(得分:0)

请试试这个:

哎呀......我完全误解了这个问题。我认为应该在数据库列中设置一些约束。请尝试直接在DB中编写插入查询,看看它是否会爆炸。

我试过这个并按预期炸弹了:

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