我正在尝试将单词“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 让我很吃惊。