2017-03-22 61 views
1

嘿所有我不知道爲什麼我收到此錯誤:當我嘗試運行此了條件,預計,不久的「@ VAL4」在上下文中指定非布爾類型的表達式

An expression of non-boolean type specified in a context where a condition is expected, near '@val4'

代碼在C#:

SELECT * FROM tT WHERE active = @val1 AND (ApDate BETWEEN @val2 AND @val3) AND @val4 

上面查詢的數據是:

@val1 = 1 
@val2 = 9/30/2016 12:00:00 AM 
@val3 = 9/30/2017 12:00:00 AM 
@val4 = (RequestID = 0 OR RequestID =469 OR RequestID =471 OR RequestID =472 OR 
      RequestID =473 OR RequestID =474 OR RequestID =494 OR 
      RequestID =496 OR RequestID =497) 

所以把那乾脆它看起來像THI S:

SELECT * 
FROM tT 
WHERE active = 1 
AND (ApDate BETWEEN '9/30/2016 12:00:00 AM' AND '9/30/2017 12:00:00 AM') 
AND (RequestID = 0 OR RequestID =469 OR RequestID =471 OR RequestID =472 OR 
    RequestID =473 OR RequestID =474 OR RequestID =494 OR 
    RequestID =496 OR RequestID =497) 

然而,當我運行的服務器管理Studio中相同的查詢它運行得很好......

而我只是用這樣的:

command.Parameters.AddWithValue("@val1", Value_here); 
command.Parameters.AddWithValue("@val2", Value_here); 
command.Parameters.AddWithValue("@val3", Value_here); 
command.Parameters.AddWithValue("@val4", Value_here); 

由於意味着將4個參數添加到查詢中。

注意不是由於當前問題,而不是現在相同的命名問題。

+0

@DavidG它正在被比較..它正在比較** RequestID ** – StealthRT

+0

對不起,誤讀。但是,似乎您正在嘗試將原始SQL作爲參數傳遞,是嗎?你能證明你是如何做到的嗎? – DavidG

+2

所以你現在有答案,而且我建議http://blogs.msmvps。com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – DavidG

回答

1

不能將SQL語句放入SQL語句中的參數中。

SQL Server無法識別參數內部的SQL,因爲它期待值。

+0

所以我只需要將它作爲普通字符串傳遞呢? – StealthRT

+0

這可能會工作,是 – NotTelling

+1

我強烈建議你不要建立這樣的字符串,因爲它很容易sql注入。 –

0

您可以使用Table-Valued Parameters和存儲過程來執行此操作。

首先,你需要創建一個程序使用一個表類型:

create type dbo.Id_udt as table (Id int not null); 
go 

然後,創建一個過程:

create procedure dbo.get_requests (
    @IsActive bit 
    , @FromDate datetime 
    , @ThruDate datetime 
    , @Ids as dbo.Id_udt readonly 
) as 
begin; 
    set nocount, xact_abort on; 

    select * 
    from t 
    inner join @Ids as i 
     on t.RequestID = i.RequestID 
    where t.active = @IsActive 
    and t.apdate between @FromDate and @ThruDate 

end; 
go 

然後,組裝和RequestIDs列表傳遞給存儲過程使用DataTable添加爲SqlParameter使用SqlDbType.Structured

表值參數參考:

相關問題