2015-05-21 51 views
0

我試圖執行以下操作:SQL如果A則B否則C

Declare @Customers nvarchar(MAX) = '15000, 15011' 
--Declare @Customers nvarchar(MAX) = NULL 


--IF A THEN B ELSE C 
--((Not A) or B) AND (A or C) 

SELECT SD.CustomerNumber, SD.CustomerName, 
    CASE WHEN F.CustomerNumber IS NOT NULL THEN 1 ELSE 0 END HasDiscount 
From [dbo].[SubscriberDetails] As SD 
LEFT JOIN [dbo].[FamilyCustomer] F 
    On F.CustomerNumber = SD.CustomerNumber 
WHERE 
((NOT @Customers IS NULL) OR F.CustomerNumber IS NOT NULL) AND (@Customers IS NULL OR SD.CustomerNumber IN (SELECT * FROM dbo.iter$ListToTable(@Customers))) 

我試圖做的是通過在逗號分隔值「15000,15011,16000的字符串。 。「或者將NULL填入@Customers參數。我使用的是從here在一個字符串 採取然後在我的存儲過程我想檢查的功能:如果@Customers傳遞至少一個值

If Customers is Null then: 
    F.CustomerNumber IS NOT NULL 
Else (@Customsers is not null Therefor) 
    SELECT * FROM dbo.iter$ListToTable(@Customers) 

一切工作正常,但我得到"Cannot insert the value NULL into column 'number', table '@tbl'; column does not allow nulls. INSERT fails." when passing in null

((不是A)或B)和(A或C)取自here

我在做什麼錯? 感謝

+0

我使用的功能,在一個字符串採用(逗號分隔)。我DON「如果@Customers爲NULL,則要執行該函數 – ShaneKm

回答

3

的問題是,在SQL OR不短路,所以null被傳遞給iter$ListToTable。我認爲最簡潔的解決方案是將功能更改爲接受null輸入。

另一種選擇是使用存儲過程本中的表valiable:

DECLARE @temp_Customers TABLE (@cust int) 

IF (@Customers IS NOT NULL) 
BEGIN 
INSERT INTO @temp_Custoers 
SELECT * FROM dbo.iter$ListToTable(@Customers) 
END 

,改變你的選擇:

... AND (@Customers IS NULL OR SD.CustomerNumber IN (SELECT @cust FROM @temp_Customers)) 
相關問題