【问题标题】:Generating create table script (with indexes, keys, constrains) for all tables in SQL Server database为 SQL Server 数据库中的所有表生成创建表脚本(带有索引、键、约束)
【发布时间】:2023-03-11 06:45:01
【问题描述】:

如果我运行以下脚本

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

我会得到所有的创建过程/函数脚本。表、索引、键和触发器是否有类似的东西?
感谢您的帮助!

【问题讨论】:

标签: sql-server-2005


【解决方案1】:

没有内置任何东西。

要在 T-SQL 中执行此操作,您需要找到或编写自己的脚本。 Example here 这可能会让你开始。

【讨论】:

    【解决方案2】:

    对于 SQL 2012 及更高版本使用此

    我在 web.xml 中尝试了许多脚本。他们都有缺陷。我终于使用 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

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2012-02-23
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多