SQL多个int查询作为参数

时间:2013-01-28 15:31:28

标签: sql list stored-procedures

代码

Create Table TestTable(
   prop1 int, 
   prop2 int
)

insert into TestTable values (1,5)
insert into TestTable values (2,3)
insert into TestTable values (3,5)
insert into TestTable values (4,3)
insert into TestTable values (5,5)

场合

我创建这个小测试只是用作一个例子,但它与我想要的类似。

情况是我有一个这样的存储过程:

create procedure TestProc
   @TestParamater <type> 
as
begin
     select * from TestTable where prop1 in @TestParameter

问题

该参数应支持以下查询的类型:

exec TestProc (select prop1 from TestTable where prop2 = 5) -- resulting in 3 prop1's

如果不使用临时表或用户定义的表,这是否可行?

如果没有,我如何使用它(使用临时表)但仍在查询中...

如:

select * 
from TestTable 
where prop1 in (insert and select everything that's in the temptable)

4 个答案:

答案 0 :(得分:2)

您可以在存储过程中动态SQL

Create Procedure TestProc
    @sqlQuery NVarchar(4000)   
AS
    Declare @inQuery AS NVarchar(4000)
    SET @inQuery = 'SELECT * FROM TestTable where prop1 in (' + @sqlQuery + ')' 
    EXECUTE(@inQuery)
GO

用法,

EXEC TestProc ('select prop1 from TestTable where prop2=5')

答案 1 :(得分:1)

为什么不直接将prop2作为int传递给存储过程?

类似的东西:

SELECT * 
FROM TestTable 
WHERE prop1 IN (SELECT prop1 FROM TestTable WHERE prop2=5)

或实际上:

SELECT * 
FROM TestTable 
WHERE prop1 IN (SELECT prop1 FROM TestTable WHERE prop2=@prop2)

这是SQL Fiddle

祝你好运。

答案 2 :(得分:0)

除非使用动态SQL,否则无法使用单一类型执行所需操作。在这种情况下,您可以将列表作为逗号分隔列表传递。

可以将列表作为字符串放入,因此生成的查询将使用如下内容:

where ','+@TestParameter+',' like '%,'+cast(prop1 as varchar(255))+',%'

这将产生与in相同的效果。您必须将值连接在一起才能生成字符串参数。

第二个查询,我只是不明白。你是什​​么意思“插入并选择临时表中的所有内容”?只需先加载临时表,然后在查询中使用它。

答案 3 :(得分:0)

你能不把整个东西放在你的sp里面并提供prop2而不是prop1?