0

以下のテーブルがあるとします ( TestTable ) :

ID 、 SystemID 、 UserID (すべての列は int 型です)

文字列パラメーターを受け入れる必要があるストアド プロシージャを作成したいと考えています。((5 and 6) or 7)のような値で、以下のクエリを適用するすべてのユーザーを返します。

Select * From TestTable Where SystemID = 5

Intersect

Select * From TestTable Where SystemID = 6

上記の結果は

Select * From TestTable Where SystemID = 7

SP は、 (((4 または 5) および 6) または 8)(((5 または 9) または 8) および 10)などの任意の組み合わせを受け入れる必要があります。

どうすればそれを実装できますか?

更新:私の問題は文字列を分割する方法ではありません..しかし、動的SQLを作成して論理的な意味を実装するにはどうすればよいですか

4

3 に答える 3

1
DECLARE @param NVARCHAR(MAX) = N'4 or 5 and 6 or 8 and 10';


DECLARE 
  @sql NVARCHAR(MAX) = N'', 
  @q NVARCHAR(MAX) = N'SELECT UserID FROM dbo.TestTable WHERE SystemID = ';

SELECT @sql = @q + REPLACE(REPLACE(@param, ' or ', '
   UNION ALL ' + @q),
 ' and ', '
   INTERSECT ' + @q);

PRINT @sql;
-- EXEC sp_executesql @sql;

結果:

SELECT UserID FROM dbo.TestTable WHERE SystemID = 4
   UNION ALL SELECT UserID FROM dbo.TestTable WHERE SystemID = 5
   INTERSECT SELECT UserID FROM dbo.TestTable WHERE SystemID = 6
   UNION ALL SELECT UserID FROM dbo.TestTable WHERE SystemID = 8
   INTERSECT SELECT UserID FROM dbo.TestTable WHERE SystemID = 10

さて、このクエリが実際に求めている結果をもたらすかどうかはわかりませんが、記載されている要件を満たしていると思います.

于 2013-04-22T11:56:01.740 に答える