2011-02-14 49 views
1

我在C#中的SQL語句(.NET Framework 4的對SQL Server 2K8運行),看起來像這樣:如何將DBNull值傳遞給參數化的SELECT語句?

SELECT [Column1] FROM [Table1] WHERE [Column2] = @Column2 

上述查詢工作正常用下面的ADO.NET代碼:

DbParameter parm = Factory.CreateDbParameter(); 
parm.Value = "SomeValue"; 
parm.ParameterName = "@Column2"; 
//etc... 

儘管如果我將DBNull.Value分配給DbParameter的Value成員,即使Column2中有空值,該查詢也會返回零行。如果我更改查詢以適應空測試:

我在運行時發現「@ Column2附近的語法錯誤」異常。有沒有辦法可以在SELECT語句的WHERE子句中使用null或DBNull作爲參數?

+0

記住null不等於null。嘗試使用LIKE而不是IS – albanx 2011-02-14 22:52:45

+0

一注。將字符串字段設置爲非空值並且不用擔心這樣的問題是值得的。添加OR或ISNULL或COALESCE可以真正達到性能。 – LukLed 2011-02-14 23:14:54

+0

@LukLed - 在我的答案中看到執行計劃`OR`在那裏似乎沒有問題。 `WHERE [Column2] = @ Column2 OR(@ Column2 IS NULL AND [Column2] IS NULL)`似乎是一個可識別的模式,最後只是一個簡單的索引查找。 – 2011-02-14 23:18:00

回答

2

您可以使用

SELECT [Column1] FROM [Table1] WHERE [Column2] = ISNULL(@Column2 , 'value'); 

「值」可以是ü希望它來表示任何價值。如果你想匹配COLUMN2具有空列,

SELECT [Column1] FROM [Table1] WHERE ISNULL([Column2], 'value') = ISNULL(@Column2 , 'value'); 
-1

你的第二個線就改成這樣:

parm.Value = DbNull.Value; 

這就是你需要做的,真的。在這種情況下,不要擔心=IS

我在哪裏,我們在項目之間共享的本地數據訪問層也會自動檢查所有查詢參數,並在執行查詢之前用DbNull.Value替換任何C#null

4
SELECT [Column1] 
FROM [Table1] 
WHERE [Column2] = @Column2 OR (@Column2 IS NULL AND [Column2] IS NULL) 

但我不知道如何優化搜索,這是。

編輯:這看起來很好,實際上與指數最終尋求至少在2008年

CREATE TABLE [Table1] 
(
[Column1] INT, 
[Column2] INT 
) 

CREATE CLUSTERED INDEX [IX] ON [dbo].[Table1] ([Column2] ASC) 

INSERT INTO [Table1] VALUES(1,NULL) 
INSERT INTO [Table1] VALUES(2,NULL) 
INSERT INTO [Table1] VALUES(3,1) 
INSERT INTO [Table1] VALUES(4,1) 
GO 

CREATE PROC foo 
@Column2 INT 
AS 
SELECT [Column1] 
FROM [Table1] 
WHERE [Column2] = @Column2 OR (@Column2 IS NULL AND [Column2] IS NULL) 

GO 

EXEC foo NULL 
EXEC foo 1 

Plan

0

您可以使用:

var cmd =new SqlCommand("SELECT ISNULL([Column1],'VALUE') as [Column1] FROM [Table1] WHERE [Column2] = @Column2"), 
          con) 

string a; 
if(textbox.text == string.empty) 
{ a = DbNull.Value} 
else { a =textbox.text} 

cmd.Parameters.AddWithValue("@Column2",a); 
cmd.ExecuteNonQuery(); 

的問候!

0

你確定它們的值是NULL而不只是空字符串嗎?如果是後者,它確實不會返回任何記錄。正如Joel在他的回答中所述,你應該在你的C#代碼中將你的null更改爲DbNull.Value。如果是第一個,則應該與''進行比較。

如果數據確實是空的,也許你可以試試這個聲明(如果你使用存儲過程):

SET ANSI_NULLS OFF 

SELECT [Column1] FROM [Table1] WHERE [Column2] = NULL 

看看如下因素article一些額外的洞察力。

相關問題