代码之家  ›  专栏  ›  技术社区  ›  Pankaj Agarwal

如何在SQL Server中使用SQL查询生成表的创建脚本

  •  6
  • Pankaj Agarwal  · 技术社区  · 14 年前

    我想在实时数据库中生成已创建表的创建表脚本。

    我知道我们可以使用右键单击表并单击“脚本表作为”菜单生成脚本,然后将生成脚本。因为我的实时数据库用户界面运行非常慢。

    我希望使用SQL查询执行相同的过程。有什么办法吗??

    3 回复  |  直到 9 年前
        1
  •  3
  •   Community Dan Abramov    7 年前

    如果您正在寻找一个TSQL解决方案,它是非常冗长的,因为 this example 显示。

    一个较短的替代方案是使用 SMO library ( example )

    (我最初回答这个问题 here ,但只有SQL Server开发人员可能不会将问题标题与此问题关联)

        2
  •  3
  •   Stefan Rogin miko    11 年前

    对于生成 CREATE TABLE 带有索引、触发器和约束的语句尝试 stored procedure 由Lowell Izaguirer制造。

    它自2004年开始测试和开发,最后一次更新是在2013年。

    我还做了一些改进,包括索引选项( PAD_INDEX , FILLFACTOR , IGNORE_DUP_KEY ):

    以下是更改,无法容纳所有代码,因此您可以在以下位置找到完整的修改版本: http://pastebin.com/LXpBeuN1 .


    更新

    我已经和洛厄尔谈过了,一个新的版本将很快上线,并对索引选项和其他改进进行了新的更改。

        3
  •  2
  •   Ardalan Shahgholi    11 年前

    使用此查询:

    DROP FUNCTION [dbo].[Get_Table_Script]
    Go
    
    Create Function Get_Table_Script
    (
        @vsTableName varchar(50)
    )
    
    Returns
        VarChar(Max)
    With ENCRYPTION
    
    Begin
    
    Declare @ScriptCommand varchar(Max)
    
    Select @ScriptCommand =
        ' 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 As SO
        Cross Apply
    
        (
            Select 
                '  [' + column_name + '] ' + 
                 data_type + 
                 (
                    Case data_type
                        When 'sql_variant' 
                            Then ''
                        When 'text' 
                            Then ''
                        When 'decimal' 
                            Then '(' + Cast( numeric_precision_radix 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)
    
            Inner Join information_schema.table_constraints As TC On (
                                                                        ( TC.Table_name = SO.Name )
                                                                        AND 
                                                                        ( TC.Constraint_Type  = 'PRIMARY KEY' )
                                                                        And 
                                                                        ( TC.TABLE_NAME = @vsTableName )
                                                                     )
            Cross Apply
                (
                    Select '[' + Column_Name + '], '
                    From  information_schema.key_column_usage As kcu
                    Where 
                        ( kcu.Constraint_Name = TC.Constraint_Name )
                    Order By ORDINAL_POSITION
                    FOR XML PATH('')
                ) As j (list)
    Where
        ( xtype = 'U' )
        AND 
        ( Name NOT IN ('dtproperties') )
    
    Return @ScriptCommand
    
    End
    

    你可以把它烧了 Function 这样地:

    Select [dbo].Get_Table_Script '<Your_Table_Name>'
    

    对于创建触发器,使用这个

    SELECT     
    DB_NAME() AS DataBaseName,                  
    dbo.SysObjects.Name AS TriggerName,
    dbo.sysComments.Text AS SqlContent
    FROM 
    dbo.SysObjects INNER JOIN 
        dbo.sysComments ON 
        dbo.SysObjects.ID = dbo.sysComments.ID
    WHERE   
    (dbo.SysObjects.xType = 'TR') 
    AND 
    dbo.SysObjects.Name LIKE '<Trigger_Name>'