Guest
Public paste!

SQL

By: a guest | Mar 19th, 2010 | Syntax: SQL | Size: 2.13 KB | Hits: 79 | Expires: Never
Copy text to clipboard
  1. ;WITH ObjectData AS (
  2.         SELECT o.[object_id], o.[name], o.[type], o.[schema_id], s.[name] AS [schema]
  3.         FROM sys.objects o
  4.         INNER JOIN sys.schemas s
  5.                 ON o.[schema_id] = s.[schema_id]
  6. ),
  7. IndexData AS (
  8.         SELECT i.[object_id], i.[index_id], i.[type_desc], i.[name] COLLATE DATABASE_DEFAULT AS [name], i.[is_unique], ds.[name] AS [scheme], ds.[type] AS [scheme_type]
  9.         FROM sys.indexes i
  10.         INNER JOIN sys.data_spaces ds
  11.                 ON i.[data_space_id] = ds.[data_space_id]
  12. ),
  13. ColumnData AS (
  14.         SELECT ic.[object_id], ic.[index_id], ic.[index_column_id], ic.[partition_ordinal], ic.[is_descending_key], c.[name]
  15.         FROM sys.index_columns ic
  16.         INNER JOIN sys.COLUMNS c
  17.                 ON ic.[object_id] = c.[object_id]
  18.                 AND ic.[column_id] = c.[column_id]
  19. ),
  20. COLUMNS AS (
  21.         SELECT i.[object_id], i.[index_id],
  22.                    CAST(LEFT(a.[COLUMNS], len(a.[COLUMNS]) - 1) AS varchar(8000)) AS COLUMNS ,
  23.                    CAST(LEFT(b.[COLUMNS], len(b.[COLUMNS]) - 1) AS varchar(8000)) AS partition_columns
  24.         FROM IndexData i
  25.         CROSS APPLY (
  26.                 SELECT c.[name] + CASE WHEN c.[is_descending_key] = 1 THEN 'DESC' ELSE '' END + ', '
  27.                 FROM ColumnData c
  28.                 WHERE i.[object_id] = c.[object_id]
  29.                   AND i.[index_id]  = c.[index_id]
  30.                 ORDER BY c.[index_column_id]
  31.                 FOR XML PATH('')
  32.         ) a (COLUMNS)
  33.         OUTER APPLY (
  34.                 SELECT c.[name] + ', '
  35.                 FROM ColumnData c
  36.                 WHERE i.[object_id] = c.[object_id]
  37.                   AND i.[index_id]  = c.[index_id]
  38.                   AND c.[partition_ordinal] > 0
  39.                 ORDER BY c.[partition_ordinal]
  40.                 FOR XML PATH('')
  41.         ) b (COLUMNS))
  42. SELECT i.[object_id],
  43.            i.[name] AS [index_name],
  44.            i.[type_desc] AS [index_type],
  45.            CAST (
  46.                         'CREATE ' + CASE WHEN i.is_unique = 1 THEN 'UNIQUE ' ELSE '' END +
  47.                     i.[type_desc] + ' INDEX [' + i.[name] + '] ON [' + o.[schema] + '].[' + o.[name] + '] (' +
  48.                         c.[COLUMNS] + ') ON [' + i.[scheme] + ']' +
  49.                         CASE WHEN i.[scheme_type] = 'PS' THEN '(' + c.[partition_columns] + ')' ELSE '' END
  50.              AS varchar(8000)
  51.            )
  52. FROM IndexData i
  53. INNER JOIN ObjectData o
  54.         ON i.[object_id] = o.[object_id]
  55. INNER JOIN COLUMNS c
  56.         ON i.[object_id] = c.[object_id]
  57.         AND i.[index_id] = c.[index_id]
  58. WHERE i.[object_id] = object_id('dbo.WF_QIC_FACT')
  59.  AND i.[index_id] = 1