2015-07-10 121 views
0

我有喜欢的查询:使用SQL IN子句

declare @aID varchar(max)='1' 
declare @pID varchar(max)=' ' 
SELECT * from Table1 WHERE 
(PId = @PID or @pID='') AND (AID = @aID or @aID = '') 

此查询工作正常。 但现在,我想使用'IN'子句。

declare @aID varchar(max)='1,2' 
SELECT * from Table1 WHERE 
(PId = @PID or @pID='') AND (AID IN (@aID) or @aID = '') 

但是这最后一个查询给我一个错误。

Error : 'Conversion failed when converting the varchar value '1,2' to data type int' 

我不想改变我的表1的设计

我怎样才能实现这一目标?

+0

声明参数AS XML为您提供了将所需的任何结构化数据转换为SP或UDF的机会......处理(简单)XML很容易,SQL-Server确实很棒这里的工作... – Shnugo

回答

1

@vars作为单个“块”被插入。决定它实际上是MULTIPLE单独的逗号分隔值不是数据库的工作。

如果您想将1,2视为两个值,则必须使用动态sql,例如,

query = "SELECT ... IN (" + @var + ")"; 
exec query; 
+0

我做到了,它只适用于如果我指定一个值。如果没有值传递,那么我得到一个错误。例如'query =“SELECT ... IN(”+ @var +“)或(”+ @var +“)=''''”; exec查询; '当我传递空的弹簧 –

+0

时,会给我一个错误,然后在传入某些内容时将一些条件日志添加到'in'子句中,否则完全跳过它。 –

+0

OP的MarcB想让@AID最终成为一个受过训练的proc的参数。我不认为我需要说明为什么这会改变事情 –

0

而不是试图用逗号dilimited值是您在您可能需要使用可变

declare @ids table (aid int) ; 
INSERT INTO @ids (aid) Values (1)(2); 

declare @idCount int; 
SELECT @idCount = COUNT(aID) FROM @ids; 

SELECT * from Table1 
WHERE 
(PId = @PID or @pID='') 
AND (
     AID IN (SELECT aid from @ids) 
     or @idCount =0) 

表如果你真的想保持逗号分隔值,你也可以使用一个split function

SELECT * from Table1 
    WHERE 
    (PId = @PID or @pID='') 
    AND (
      AID IN (SELECT item from dbo.SplitString(@aid, ',')) 
      or @aid = "") 
+0

我将此作为Store Proc。我如何插入值1,2? –

+0

你是说@aID是一个参数吗? –

+0

对于另一部分,我得到Error为** **当子查询没有引入EXISTS时,只有一个表达式可以在选择列表中指定** –