1

代码

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

4 回答 4

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')
于 2013-01-28T15:41:32.810 回答
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 小提琴

祝你好运。

于 2013-01-28T15:35:28.047 回答
0

除非您使用动态 SQL,否则您无法使用单一类型做您想做的事。在这种情况下,您可以将列表作为逗号分隔的列表传入。

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

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

这将产生与in. 您必须将这些值连接在一起才能生成字符串参数。

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

于 2013-01-28T15:35:45.290 回答
0

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

于 2013-01-28T15:38:08.497 回答