代码
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)
答案 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?