我需要将数据库的表来按月建表,并且不删除老表的数据由于平常会经常改动数据库,所以用原有的建表代码来建表是不合适的在管理器中,我们可以右键表然后导出建表脚本,这时我们会得到这个表的所有建表信息包括索引等等请问能不能用脚本直接获取到上面手工导出的建表脚本,谢谢数据库索引

解决方案 »

  1.   


    select  'create table [' + so.name + '] (' + o.list + ')' + CASE WHEN tc.Constraint_Name IS NULL THEN '' ELSE 'ALTER TABLE ' + so.Name + ' ADD CONSTRAINT ' + tc.Constraint_Name  + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + ')' END
    from    sysobjects so
    cross apply
        (SELECT 
            '  ['+column_name+'] ' + 
            data_type + case data_type
                when 'sql_variant' then ''
                when 'text' then ''
                when 'ntext' then ''
                when 'xml' then ''
                when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')'
                else coalesce('('+case when character_maximum_length = -1 then 'MAX' else cast(character_maximum_length as varchar) end +')','') end + ' ' +
            case when exists ( 
            select id from syscolumns
            where object_name(id)=so.name
            and name=column_name
            and columnproperty(id,name,'IsIdentity') = 1 
            ) then
            'IDENTITY(' + 
            cast(ident_seed(so.name) as varchar) + ',' + 
            cast(ident_incr(so.name) as varchar) + ')'
            else ''
            end + ' ' +
             (case when IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' + 
              case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END + ', '      from information_schema.columns where table_name = so.name
         order by ordinal_position
        FOR XML PATH('')) o (list)
    left join
        information_schema.table_constraints tc
    on  tc.Table_name       = so.Name
    AND tc.Constraint_Type  = 'PRIMARY KEY'
    cross apply
        (select '[' + Column_Name + '], '
         FROM   information_schema.key_column_usage kcu
         WHERE  kcu.Constraint_Name = tc.Constraint_Name
         ORDER BY
            ORDINAL_POSITION
         FOR XML PATH('')) j (list)
    where   xtype = 'U'
    AND name='[表名]'
      

  2.   

    楼主拿SQL Profiler工具,抓一下看看就明白了,以导出A表为例:
    #1.SQL SERVER查询表相关的所有系统表中的信息。下面只是列出其中一部分代码:
    exec sp_executesql N'SELECT
    CAST(
            serverproperty(N''Servername'')
           AS sysname) AS [Server_Name],
    db_name() AS [Database_Name],
    SCHEMA_NAME(tbl.schema_id) AS [Table_Schema],
    tbl.name AS [Table_Name],
    clmns.column_id AS [ID],
    clmns.name AS [Name],
    clmns.is_ansi_padded AS [AnsiPaddingStatus],
    clmns.is_computed AS [Computed],
    ISNULL(cc.definition,N'''') AS [ComputedText],
    ISNULL(baset.name, N'''') AS [SystemType],
    s1clmns.name AS [DataTypeSchema],
    CAST(clmns.is_rowguidcol AS bit) AS [RowGuidCol],
    CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length],
    CAST(clmns.precision AS int) AS [NumericPrecision],
    clmns.is_identity AS [Identity],
    CAST(ISNULL(ic.seed_value,0) AS bigint) AS [IdentitySeed],
    CAST(ISNULL(ic.increment_value,0) AS bigint) AS [IdentityIncrement],
    ISNULL(clmns.collation_name, N'''') AS [Collation],
    CAST(clmns.scale AS int) AS [NumericScale],
    clmns.is_nullable AS [Nullable],
    CAST(clmns.is_filestream AS bit) AS [IsFileStream],
    ISNULL(ic.is_not_for_replication, 0) AS [NotForReplication],
    (case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else d.name end) AS [Default],
    (case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else schema_name(d.schema_id) end) AS [DefaultSchema],
    (case when clmns.rule_object_id = 0 then N'''' else r.name end) AS [Rule],
    (case when clmns.rule_object_id = 0 then N'''' else schema_name(r.schema_id) end) AS [RuleSchema],
    ISNULL(xscclmns.name, N'''') AS [XmlSchemaNamespace],
    ISNULL(s2clmns.name, N'''') AS [XmlSchemaNamespaceSchema],
    ISNULL( (case clmns.is_xml_document when 1 then 2 else 1 end), 0) AS [XmlDocumentConstraint],
    CAST(ISNULL(cc.is_persisted, 0) AS bit) AS [IsPersisted],
    CAST(ISNULL((select TOP 1 1 from sys.foreign_key_columns AS colfk where colfk.parent_column_id = clmns.column_id and colfk.parent_object_id = clmns.object_id), 0) AS bit) AS [IsForeignKey],
    CAST(clmns.is_sparse AS bit) AS [IsSparse],
    CAST(clmns.is_column_set AS bit) AS [IsColumnSet],
    usrt.name AS [DataType]
    FROM
    sys.tables AS tbl
    INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
    LEFT OUTER JOIN sys.computed_columns AS cc ON cc.object_id = clmns.object_id and cc.column_id = clmns.column_id
    LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = clmns.system_type_id) and (baset.user_type_id = clmns.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
    LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id
    LEFT OUTER JOIN sys.schemas AS s1clmns ON s1clmns.schema_id = usrt.schema_id
    LEFT OUTER JOIN sys.identity_columns AS ic ON ic.object_id = clmns.object_id and ic.column_id = clmns.column_id
    LEFT OUTER JOIN sys.objects AS d ON d.object_id = clmns.default_object_id
    LEFT OUTER JOIN sys.objects AS r ON r.object_id = clmns.rule_object_id
    LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns ON xscclmns.xml_collection_id = clmns.xml_collection_id
    LEFT OUTER JOIN sys.schemas AS s2clmns ON s2clmns.schema_id = xscclmns.schema_id
    WHERE
    (tbl.name=@_msparam_0 and SCHEMA_NAME(tbl.schema_id)=@_msparam_1)
    ORDER BY
    [Database_Name] ASC,[Table_Schema] ASC,[Table_Name] ASC,[ID] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'A',@_msparam_1=N'dbo'exec sp_executesql N'SELECT
    CAST(
            serverproperty(N''Servername'')
           AS sysname) AS [Server_Name],
    db_name() AS [Database_Name],
    SCHEMA_NAME(tbl.schema_id) AS [Table_Schema],
    tbl.name AS [Table_Name],
    i.name AS [Name],
    CAST(ISNULL(k.is_system_named, 0) AS bit) AS [IsSystemNamed],
    i.is_primary_key + 2*i.is_unique_constraint AS [IndexKeyType],
    CAST(CASE i.type WHEN 1 THEN 0 WHEN 3 THEN CASE WHEN xi.using_xml_index_id IS NULL THEN 2 ELSE 3 END WHEN 4 THEN 4 WHEN 6 THEN 5 ELSE 1 END AS tinyint) AS [IndexType],
    i.is_unique AS [IsUnique],
    CAST(CASE i.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsClustered],
    i.is_disabled AS [IsDisabled],
    CASE WHEN ''PS''=dsi.type THEN dsi.name ELSE N'''' END AS [PartitionScheme],
    case UPPER(ISNULL(xi.secondary_type,'''')) when ''P'' then 1 when ''V'' then 2 when ''R'' then 3 else 0 end AS [SecondaryXmlIndexType],
    CASE WHEN ''FG''=dsi.type THEN dsi.name ELSE N'''' END AS [FileGroup],
    CASE WHEN ''FD''=dstbl.type THEN dstbl.name ELSE N'''' END AS [FileStreamFileGroup],
    CASE WHEN ''PS''=dstbl.type THEN dstbl.name ELSE N'''' END AS [FileStreamPartitionScheme],
    i.ignore_dup_key AS [IgnoreDuplicateKeys],
    i.fill_factor AS [FillFactor],
    CAST(INDEXPROPERTY(i.object_id, i.name, N''IsPadIndex'') AS bit) AS [PadIndex],
    ~i.allow_row_locks AS [DisallowRowLocks],
    ~i.allow_page_locks AS [DisallowPageLocks],
    ISNULL(s.no_recompute,0) AS [NoAutomaticRecomputation],
    CAST(ISNULL(spi.spatial_index_type,0) AS tinyint) AS [SpatialIndexType],
    CAST(ISNULL(si.bounding_box_xmin,0) AS float(53)) AS [BoundingBoxXMin],
    CAST(ISNULL(si.bounding_box_ymin,0) AS float(53)) AS [BoundingBoxYMin],
    CAST(ISNULL(si.bounding_box_xmax,0) AS float(53)) AS [BoundingBoxXMax],
    CAST(ISNULL(si.bounding_box_ymax,0) AS float(53)) AS [BoundingBoxYMax],
    CAST(ISNULL(si.level_1_grid,0) AS smallint) AS [Level1Grid],
    CAST(ISNULL(si.level_2_grid,0) AS smallint) AS [Level2Grid],
    CAST(ISNULL(si.level_3_grid,0) AS smallint) AS [Level3Grid],
    CAST(ISNULL(si.level_4_grid,0) AS smallint) AS [Level4Grid],
    CAST(ISNULL(si.cells_per_object,0) AS int) AS [CellsPerObject],
    ISNULL(i.filter_definition, N'''') AS [FilterDefinition],
    CAST(OBJECTPROPERTY(i.object_id,N''IsMSShipped'') AS bit) AS [IsSystemObject],
    CAST(CASE WHEN filetableobj.object_id IS NULL THEN 0 ELSE 1 END AS bit) AS [IsFileTableDefined]
    FROM
    sys.tables AS tbl
    INNER JOIN sys.indexes AS i ON (i.index_id > @_msparam_0 and i.is_hypothetical = @_msparam_1) AND (i.object_id=tbl.object_id)
    LEFT OUTER JOIN sys.key_constraints AS k ON k.parent_object_id = i.object_id AND k.unique_index_id = i.index_id
    LEFT OUTER JOIN sys.xml_indexes AS xi ON xi.object_id = i.object_id AND xi.index_id = i.index_id
    LEFT OUTER JOIN sys.data_spaces AS dsi ON dsi.data_space_id = i.data_space_id
    LEFT OUTER JOIN sys.tables AS t ON t.object_id = i.object_id
    LEFT OUTER JOIN sys.data_spaces AS dstbl ON dstbl.data_space_id = t.Filestream_data_space_id and i.index_id < 2
    LEFT OUTER JOIN sys.stats AS s ON s.stats_id = i.index_id AND s.object_id = i.object_id
    LEFT OUTER JOIN sys.spatial_indexes AS spi ON i.object_id = spi.object_id and i.index_id = spi.index_id
    LEFT OUTER JOIN sys.spatial_index_tessellations as si ON i.object_id = si.object_id and i.index_id = si.index_id
    LEFT OUTER JOIN sys.filetable_system_defined_objects AS filetableobj ON i.object_id = filetableobj.object_id
    WHERE
    (tbl.name=@_msparam_2 and SCHEMA_NAME(tbl.schema_id)=@_msparam_3)
    ORDER BY
    [Database_Name] ASC,[Table_Schema] ASC,[Table_Name] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000)',@_msparam_0=N'0',@_msparam_1=N'0',@_msparam_2=N'A',@_msparam_3=N'dbo'
    #2.根据查询信息,拼凑成CREATE TABLE脚本,展现给用户(这一步,在SQL Profiler中看不出来)
    所以,想用现成的SQL,是不可能了。只能得到信息后,自己写。
      

  3.   

    可以用DDL触发器实现自动更新..
    1楼的代码,即可得到create table...这样的SQL脚本.