1

我正在尝试将单词“Null”(字面意思)插入到存储过程的参数中。出于某种原因,SqlServer 似乎认为我的意思是 NULL 而不是“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

关于如何解决这个问题的任何想法?

编辑:设置姓氏的方法是这样的——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)中替换了它。在调用Execute Scalar的DataService.cs中,参数还没有调整。它们在运行 DataProvider 的 ExecuteScalar 时得到调整,DataProvider 是一个抽象类(因此 Postgre 和 Oracle 将各自拥有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams 让我很吃惊。

4

2 回答 2

1

值得注意的是,作为未来参考,SubSonic 在最后一分钟在数据提供者(在我的例子中是 SqlDataProvider)中替换了它。在调用Execute Scalar的DataService.cs中,参数还没有调整。它们在运行 DataProvider 的 ExecuteScalar 时得到调整,DataProvider 是一个抽象类(因此 Postgre 和 Oracle 将各自拥有自己的代码位)。具体来说,SubSonic.SqlDataProvider.AddParams 让我很吃惊。

于 2010-04-13T19:33:28.947 回答
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

高温高压

于 2010-04-13T18:36:20.983 回答