2010-09-01 148 views
2

所有表如果我運行下面的腳本生成創建表腳本(使用索引,鍵約束),在SQL Server數據庫

SELECT so.Name, sc.Text 
FROM syscomments sc JOIN sysobjects so ON sc.ID = so.ID 

我會得到所有的創造過程/函數的腳本。對於表,索引,鍵和觸發器有沒有這樣的事情?
謝謝你的幫助!

+0

的[可能的複製生成所有指標的劇本,在SQL Server數據庫中的鍵](http://stackoverflow.com/questions/18610288/generate-script-of-all-indexes-keys-in-the-sql-server-database) – bummi 2015-12-17 23:27:17

回答

1

沒有內置。

在T-SQL中執行此操作您需要查找或編寫自己的腳本。 Example here可能會讓你開始。

0

for SQL 2012 and later use this

我已經嘗試了很多web腳本。他們都有缺陷。我終於在msdn網站上使用了一篇文章編寫了腳本,並將其改爲適用於許多情況。

注意:此腳本的工作原理的SQL Server 2012和更高版本的

WITH IndexInfo AS (
SELECT ix.object_id 
    , ix.NAME AS IndexName 
    , ix.type_desc 
    , ix.filter_definition 
    , ix.is_unique 
    , ix.is_primary_key 
    , ix.allow_row_locks 
    , ix.allow_page_locks 
    , ds.NAME AS DataSpaceName 
    , ds.type AS DataSpaceType 
    , ix.is_padded 
    , object_schema_name(ix.object_id) AS SchemaName 
    , object_name(ix.object_id) AS TableName 
    , IIF(ix.type <= 2, is_included_column, 0) AS HasIncludedColumn 
    , IIF(ix.type in (5, 6), 1, 0) AS IsColumnStore 
    , (
     SELECT KeyColumns 
     FROM (
      SELECT IC2.object_id 
       , IC2.index_id 
       , STUFF((
         SELECT ' , ' + C.NAME + IIF(MAX(CONVERT(INT, IC1.is_descending_key)) = 1 AND ix.type <= 2, ' DESC ', ' ') 
         FROM sys.index_columns IC1 
         JOIN sys.columns C ON C.object_id = IC1.object_id 
          AND C.column_id = IC1.column_id 
          --AND IC1.is_included_column = 0 
          AND IIF(ix.type <= 2, IC1.is_included_column, 0) = 0 
          AND IIF(ix.type <= 2, IC1.key_ordinal, ic.index_column_id) > 0 
         WHERE IC1.object_id = IC2.object_id 
          AND IC1.index_id = IC2.index_id 
         GROUP BY IC1.object_id 
          , C.NAME 
          , index_id 
          , IC1.key_ordinal 
          , IC1.index_column_id 
         ORDER BY IIF(ix.type <= 2, IC1.key_ordinal, IC1.index_column_id) 
         FOR XML PATH('') 
         ), 1, 2, '') KeyColumns 
      FROM sys.index_columns IC2 
      GROUP BY IC2.object_id 
       , IC2.index_id 
      ) tmp 
     WHERE tmp.object_id = ix.object_id 
      AND tmp.index_id = ix.index_id 
     ) AS KeyColumnsStr 
    , (
     SELECT IncludedColumns 
     FROM (
      SELECT IC2.object_id, IC2.index_id 
       , STUFF((
         SELECT ' , ' + C.NAME 
         FROM sys.index_columns IC1 
         JOIN sys.columns C ON C.object_id = IC1.object_id 
          AND C.column_id = IC1.column_id 
          --AND IC1.is_included_column = 1 
          AND IIF(ix.type <= 2, IC1.is_included_column, 0) <> 0 
         WHERE IC1.object_id = IC2.object_id 
          AND IC1.index_id = IC2.index_id 
         --and IIF(ix.type <= 2, IC1.key_ordinal, ic.index_column_id) > 0 
         GROUP BY IC1.object_id, C.NAME, index_id, IC1.key_ordinal, IC1.index_column_id 
         ORDER BY IIF(ix.type <= 2, IC1.key_ordinal, IC1.index_column_id) 
         FOR XML PATH('') 
         ), 1, 2, '') IncludedColumns 
      FROM sys.index_columns IC2 
      GROUP BY IC2.object_id, IC2.index_id 
      ) tmp 
     WHERE tmp.object_id = ix.object_id 
      AND tmp.index_id = ix.index_id 
      AND IncludedColumns IS NOT NULL 
     ) AS IncludedColumnsStr 
FROM sys.indexes ix 
INNER JOIN sys.index_columns ic ON ic.index_id = ix.index_id AND ic.object_id = ix.object_id 
INNER JOIN sys.columns col ON col.column_id = ic.column_id AND col.object_id = ix.object_id 
INNER JOIN sys.data_spaces ds ON ix.data_space_id = ds.data_space_id 
WHERE ix.NAME IS NOT NULL AND IIF(ix.type <= 2, ic.key_ordinal, ic.index_column_id) > 0 
) 
, Scrpt AS (
SELECT * 
    , 'CREATE ' 
    + CASE WHEN is_unique = 1 THEN ' UNIQUE ' ELSE '' END 
    + type_desc COLLATE DATABASE_DEFAULT + ' INDEX ' + IndexName + ' ON ' 
     + SchemaName + '.' + TableName + '(' + KeyColumnsStr + ')' 
    + ISNULL(IIF(HasIncludedColumn > 0, ' ', ' INCLUDE (' + IncludedColumnsStr + ')'), '') 
    + IIF(filter_definition IS NULL, ' ', ' WHERE ' + filter_definition) 
    + ' WITH (' 
     + CASE WHEN IsColumnStore = 1 THEN ' DROP_EXISTING = OFF ' 
      ELSE 
       IIF(is_padded = 1, ' PAD_INDEX = ON ', ' PAD_INDEX = OFF ') + ',' 
       + ' DROP_EXISTING = OFF ' + ',' 
       + ' ONLINE = OFF ' + ',' 
       + IIF(allow_row_locks = 1, ' ALLOW_ROW_LOCKS = ON ', ' ALLOW_ROW_LOCKS = OFF ') + ',' 
       + IIF(allow_page_locks = 1, ' ALLOW_PAGE_LOCKS = ON ', ' ALLOW_PAGE_LOCKS = OFF ') 
      END 
     + ') ' 
    + IIF(DataSpaceType = 'FG','ON [' + DataSpaceName + ']', '') AS CreateIndexScript 
FROM IndexInfo 
) 
SELECT DISTINCT IndexName, CreateIndexScript 
FROM Scrpt 
WHERE object_id = object_id('dbo.SWPartition') 

作爲信貸原作者,我提到了原來的鏈接在這裏 How to Generate Index Creation Scripts

相關問題