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 Fiddleです。

幸運を。

于 2013-01-28T15:35:28.047 に答える
0

動的 SQL を使用しない限り、単一の型で目的を達成することはできません。その場合、コンマ区切りのリストとしてリストを渡します。

リストを文字列として入れることができるので、結果のクエリは次のようになります。

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

これにより、 と同じ効果が得られますin。文字列引数を作成するには、値を連結する必要があります。

The second query, I just do not understand. What do you mean "insert and select everything in the temp table"? Just load the temp table first and then use it in the query.

于 2013-01-28T15:35:45.290 に答える
0

すべてを sp 内に配置して、prop1 の代わりに prop2 を提供することはできませんか?

于 2013-01-28T15:38:08.497 に答える