我有一个SourceTable
和一个表变量@TQueries
,其中包含以 SourceTable
.
预期结果是动态生成SELECT
语句,这些语句返回由 in 中的谓词指定的 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 或逐行迭代。我最接近满足此条件的集合操作是使用表变量来存储每个查询或大量 CTE 的结果。
欢迎提出建议和意见。