をターゲットとするさまざまなT-SQL述語を含む SourceTable
テーブル変数があります。@TQueries
SourceTable
期待される結果はSELECT
、の述語で指定されたIDのリストを返すステートメントを動的に生成すること@TQueries
です。動的に生成された各SELECT
ステートメントも特定の順序で実行する必要があり、最終的な値のセットは一意であり、順序を保持する必要があります。
幸い、取得する必要のある値の数と、生成する必要のある動的クエリの数には制限があります。Idリストには最大で10個のIDを含める必要があり、7個を超えるクエリは想定されていません。
以下は、実際のデータ/データベースではなく、このセットアップのサンプルです。
-- Set up some test data, this is quick and dirty just to provide some data to test against
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SourceTable]') AND type in (N'U'))
BEGIN
-- Create a numbers table, sorta
SELECT TOP 20
IDENTITY(INT,1,1) AS Id,
ABS(CHECKSUM(NewId())) % 100 AS [SomeValue]
INTO [SourceTable]
FROM sysobjects a
END
DECLARE @TQueries TABLE (
[Ordinal] INT,
[WherePredicate] NVARCHAR(MAX),
[OrderByPredicate] NVARCHAR(MAX)
);
-- Simulate SELECTs with different order by that get different data due to varying WHERE clauses and ORDER conditions
INSERT INTO @TQueries VALUES ( 1, N'[Id] IN (6,11,13,7,10,3,15)', '[SomeValue] ASC' ) -- Sort Asc
INSERT INTO @TQueries VALUES ( 2, N'[Id] IN (9,15,14,20,17)', '[SomeValue] DESC' ) -- Sort Desc
INSERT INTO @TQueries VALUES ( 3, N'[Id] IN (20,10,1,16,11,19,9,15,17,6,2,3,13)', 'NEWID()' ) -- Sort Random
私の主な問題は、CURSORの使用を回避すること、または行を1つずつ繰り返すことです。この基準を満たす集合演算に最も近いのは、テーブル変数を使用して各クエリまたは大規模なCTEの結果を格納することです。
提案やコメントは大歓迎です。