您可以使用CTE尝试此查询
DECLARE @searchIndex nvarchar(100) = 'name,age',
@tableName nvarchar(100) = 'your_tableName'
;WITH cte AS
(
SELECT i.name AS index_name, c.name
FROM sys.indexes i LEFT JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
LEFT JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.object_id = OBJECT_ID(@tableName) AND ic.is_included_column != 1
), cte2 AS
(
SELECT c2.index_name,
STUFF((SELECT ',' + c.name
FROM cte c
WHERE c.index_name = c2.index_name
FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'), 1, 1, '') [columns]
FROM cte c2
GROUP BY c2.index_name
)
SELECT *
FROM cte2
WHERE [columns] = @searchIndex
在第二种情况下,无论顺序指定列和空间
DECLARE @searchIndex nvarchar(100) = ' age, name' ,
@tableName nvarchar (100) = 'your_tableName'
;WITH ParsSearchIndex AS
(
SELECT SUBSTRING(@searchIndex , 0 , CHARINDEX ( ',' , @searchIndex )) AS val ,
CAST(STUFF (@searchIndex + ',' , 1, CHARINDEX( ',', @searchIndex), '') AS nvarchar (100 )) AS stval
UNION ALL
SELECT LTRIM(SUBSTRING (stval , 0, CHARINDEX( ',', stval))),
CAST(STUFF (stval , 1, CHARINDEX( ',' , stval ), '' ) AS nvarchar(100 ))
FROM ParsSearchIndex
WHERE stval != ''
), max_ParsSearchIndex AS
(
SELECT val, COUNT(*) OVER() AS cnt
FROM ParsSearchIndex
WHERE val != ''
), cte AS
(
SELECT i.name AS index_name, c.name , ic .is_included_column,
MAX(ic .index_column_id) OVER( PARTITION BY i. index_id) AS maxIndex_column_id
FROM sys.indexes i LEFT JOIN sys. index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
LEFT JOIN sys. columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.object_id = OBJECT_ID(@tableName )
), cte2 AS
(
SELECT c2.index_name , COUNT (*) AS cnt, c2. maxIndex_column_id,
STUFF((SELECT ',' + c .name
FROM cte c
WHERE c .index_name = c2 .index_name
FOR XML PATH , TYPE ).value( '.[1]', 'nvarchar(max)'), 1 , 1, '') [columns]
FROM cte c2
WHERE c2.is_included_column != 1 AND EXISTS (
SELECT 1
FROM max_ParsSearchIndex p
WHERE c2 .name = p .val AND p .cnt = c2.maxIndex_column_id
)
GROUP BY c2 .index_name, c2. maxIndex_column_id
)
SELECT index_name, [columns]
FROM cte2
WHERE cnt = maxIndex_column_id