Как найти индекс существует по нескольким столбцам - PullRequest
0 голосов
/ 24 октября 2018

У меня есть SQL-запрос с дельта-сценарием, где я должен проверить, существует ли определенный индекс, если нет, то создать его.

например, структура таблицы:

tableA
Col1 int
Col2 varchar
Col3 varchar
Col4 DateTime

Изапрос:

IF EXISTS (SELECT 1  
            FROM sys.indexes AS i  
            INNER JOIN sys.index_columns AS ic   
            ON i.object_id = ic.object_id 
                     AND i.index_id = ic.index_id  
                     WHERE i.object_id =OBJECT_ID('dbo.tableA') 
                     AND COL_NAME(ic.object_id,ic.column_id) = 'Col2' ) 
BEGIN
    PRINT 'Index Exists!'
END
ELSE
BEGIN
              PRINT 'Nonclustered does not Exists!'
              IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_tableA_Col2_Col3') 
              BEGIN
              PRINT 'Creating index on tableA'
              CREATE NONCLUSTERED INDEX [IX_tableA_Col2_Col3] ON [dbo].[tableA]
              (
                  [Col2] ASC,
                  [Col3] ASC
              )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
              END
END

Там запрос может проверить, есть ли индекс на Col2 или нет, но здесь я хочу достичь, это проверить, есть ли индекс, созданный на Col2 и Col3 если нет, то создайте.

Как я могу это сделать?

1 Ответ

0 голосов
/ 24 октября 2018

Попробуйте этот запрос, он вернет index_id индекса, созданного в обоих указанных столбцах:

declare @tblName varchar(20) = 'yourTable',
        @col1 varchar(20) = 'col1',
        @col2 varchar(20) = 'col2';

select index_id from (
    select index_id,
           (select name 
            from sys.columns 
            where object_id = ic.object_id and column_id = ic.column_id
              and name in (@col1, @col2)) name
    from sys.index_columns ic
    where object_name(object_id) = @tblName
) a group by index_id
having count(*) = 2
...