2017-03-22 22 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

表值参数参考:

相关问题