2010-09-14 72 views
2

字符串NULL我有寫的字符串,然後執行使用命令Exec的(字符串)就像一個SQL查詢如下:處理是內部的SQL

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (' + CAST(@TestId AS NVARCHAR) + ' IS NULL OR TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
EXEC(@Query) 

現在的問題是,IS NULL不會被解析正確的內部字符串,但是當我從字符串中刪除IS NULL它正常工作,並且@TestId採用非空值時它正常工作現在的問題是在@Query字符串內部的IS NULL的投射。

注意:@TestId是一個過程參數

我需要知道如何讓SQL感到IS NULL和提前

+0

您在@Query中構建查詢並執行它的任何特定原因?在我看來,這可能是一個直接的SELECT語句,而沒有EXEC – LittleBobbyTables 2010-09-14 12:40:11

+0

我公開了部分SQL語句,但它根據特定參數是可變的,所以它不能顯式SQL – Ahmy 2010-09-14 12:46:59

回答

4

如果你確實需要使用動態SQL爲此,使用sp_executesql的是這樣的:

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (@TestId IS NULL OR TestId = @TestId)' 

EXECUTE sp_executesql @Query, N'@TestId BIG INT', @TestId 
0

構建動態查詢正確分析

謝謝不好,那麼...說,你可以通過移動動態查詢之外的空檢查來處理它,並在那裏處理它:

set @Query = 'select * from registrations where registrationId = 15 and 
      CAST(TestId AS NVARCHAR) = ' + ISNULL(CAST(@TestId AS NVARCHAR), '') 

另一個說明,爲什麼你使用一個動態構建的查詢來完成像這樣簡單的事情?它可能是一個常規的SELECT語句,它會使事情變得複雜得多。

select * from registrations where registrationId = 15 and TestId = @TestId 
+0

如果TestId爲空,則動態SQL將導致無效查詢。當TestID爲空時,第二個查詢不會返回任何行,既不是IMO也不是,因爲TestID = NULL的結果是UNKNOWN)。 – 2010-09-14 12:43:07

0

從你的代碼我懷疑你想要過濾TestId的註冊結果,因爲它不是null。爲什麼不用編程方式而不是SQL查詢呢?類似的規定(語法我是錯的):

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
if(@TestId IS NULL) 
    set @Query = 'SELECT * from Registrations where RegistrationId = 15' 
else 
    set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
EXEC(@Query) 

此外,賈斯汀Niessner是正確的,動態的SQL是儘可能避免(這可能沒有動態SQL來完成)。

+0

我知道這種替代解決方案,但我需要一個解決方案,以便如何在SQL字符串中添加IS NULL,但是我已經使用了這種解決方案,但我需要一個解決方案在字符串內部注入IS NULL。 – Ahmy 2010-09-14 12:50:04

1

對此,您不需要動態SQL。另外,如果您要生成動態SQL,則這樣做的好處之一是,您的查詢不需要具有這種WHERE TestId [email protected] OR @TestId IS NULL構造,這會導致計劃緩存和不必要的表掃描問題。

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 

IF @TestId IS NULL 
SELECT * from Registrations where RegistrationId = 15 
ELSE 
SELECT * from Registrations where RegistrationId = 15 AND TestId [email protected] 

編輯

如下評論,如果你確實需要動態SQL然後使用sp_executesql和產生不同的字符串的情況下@TestId is null。不要將兩種情況都放在同一個查詢中。

+0

我知道這個替代解決方案,但我需要一個解決方案如何在SQL字符串中添加IS NULL,但這個解決方案我已經在使用,但我需要一個解決方案來注入字符串內的IS NULL – Ahmy 2010-09-14 12:48:46

1

其他的答案提供瞭解決方案。這就是爲什麼你的解決方案不起作用。當@TestId爲空時,您將null連接到您的@Query字符串,並將null指定給@Query。如果您打印@Query代替exec,您將看到將運行的查詢。

Declare @TestId bigint = 10--null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (' + CAST(@TestId AS NVARCHAR) + ' IS NULL OR TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
--EXEC(@Query) 
print @Query 
+0

+1發現! – 2010-09-14 17:07:12