2013-02-21 75 views
1

有沒有將列名與索引所具有的列名進行匹配的方法。根據列名確定索引

因此,例如,讓我們說指數1使用列的姓名,年齡,地址和索引2使用(在同一個表)的姓名,年齡。(一切爲了一個特定的表)

如果我通過姓名,年齡和表名稱存儲過程,我應該寫什麼查詢哪些將返回我index2而不是index1。

我所遇到的如何列出列與像索引和表名的例子很多:

How can we check that table have index or not?

但仍然有問題,寫我的使用SQL查詢。

任何幫助將不勝感激,

謝謝

(這是針對Microsoft SQL Server 2008 - 2012)

這是我自己寫的,它並沒有正常,因此工作問題

select index1.name,sys.tables.name, Stuff((SELECT ',' + sys.columns.name AS [text()] 
FROM 
(
    select sys.columns.name 
    from sys.columns 
    inner join sys.index_columns On sys.index_columns.index_column_id=sys.columns.column_id 
    inner join sys.indexes on sys.indexes.index_id=sys.index_columns.index_id 
    where sys.indexes.index_id=index1.index_id 
) x 
For XML PATH (''), type).value('(./text())[1]','NVARCHAR(MAX)'),1,1,'') As coLName 
from sys.indexes as index1 
inner join sys.tables on sys.tables.object_id=index1.object_id 
inner join sys.index_columns On index1.index_id=sys.index_columns.index_id AND sys.index_columns.object_id = sys.tables.object_id 
inner join sys.columns on sys.columns.column_id=sys.index_columns.column_id And sys.columns.object_id=sys.tables.object_id 
where sys.tables.name=TABLE_NAME 
+1

您使用哪種RDBMS? – 2013-02-21 14:25:40

+1

這是什麼SQL產品?與Keys不同,在SQL中,索引幾乎完全是特定於實現的,所以您必須知道您正在使用什麼類型的SQL來編寫類似這樣的內容。 – RBarryYoung 2013-02-21 14:26:33

+0

對不起,這是用於Microsoft sql server 2008-2012 – sagar 2013-02-21 14:30:34

回答

1

你可以嘗試用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 
+0

謝謝,這是做的工作。 – sagar 2013-02-21 16:03:54

+0

它是否重要的​​順序,我指定列名例如,如果我指定年齡,這個名字返回什麼都沒有。 – sagar 2013-02-21 16:22:13

+0

我想我將不得不按字母順序指定列。 – sagar 2013-02-21 16:48:03

0

這爲我工作。

DECLARE @searchIndex nvarchar(100) = 'age,name', 
     @schemeName nvarchar(100) = 'dbo', 
     @tableName nvarchar(100) = 'tableName' 

SELECT 
    name 
FROM (SELECT 
    indexes.name, 
    (SELECT 
      c1.name + ',' 
    FROM sys.schemas s1 
    INNER JOIN sys.tables t1 
     ON s1.schema_id = t1.schema_id 
     AND tables.object_id = t1.object_id 
    INNER JOIN sys.columns c1 
     ON t1.object_id = c1.object_id 
    INNER JOIN sys.indexes i1 
     ON t1.object_id = i1.object_id 
     AND indexes.index_id = i1.index_id 
    INNER JOIN sys.index_columns ic1 
     ON t1.object_id = ic1.object_id 
     AND i1.index_id = ic1.index_id 
     AND c1.column_id = ic1.column_id 
    WHERE schemas.schema_id = s1.schema_id 
    ORDER BY c1.name 
    FOR xml PATH ('')) 
    AS colName 
FROM sys.schemas 
INNER JOIN sys.tables 
    ON schemas.schema_id = tables.schema_id 
    AND tables.name = @tableName 
INNER JOIN sys.indexes 
    ON tables.object_id = indexes.object_id 
WHERE schemas.name = @schemeName) A 
WHERE A.colName = @searchIndex + ',' 
+0

它是否與我指定列名的順序有關係,因爲這不會爲年齡返回任何內容,名稱 – sagar 2013-02-21 16:26:57

+0

此查詢通過ic1.index_column_id命令結果。所以排序很重要。這假設年齡,名字和姓名,年齡是你可能需要的兩個不同的指標。 – 2013-02-21 16:39:14

+0

雅我想我只是按字母順序指定列名,因爲上面的查詢按字母順序返回列名。再次感謝你。 – sagar 2013-02-21 16:47:38