2010-11-18 70 views
5

我想在我的活动数据库中生成已创建表的创建表脚本。如何在SQL Server中使用SQL查询生成表的创建脚本

我知道我们可以使用右键单击表格生成脚本,然后点击'script table as'菜单并生成脚本。因为我的活动数据库用户界面运行速度很慢。

我想用SQL查询来做同样的过程。有什么办法吗?

+2

这看起来像你在做什么;不是我的答案,但没有意义重新发明轮子... http://sqlblogcasts.com/blogs/madhivanan/archive/2007/08/27/generate-sql-script.aspx – nimizen 2010-11-18 10:28:53

+0

@nimizen有限制:它只是创建表并且不创建索引和约束,你可以用'SELECT top 0 * INTO clone FROM table'来完成。 – 2013-10-30 09:05:01

回答

3

如果您正在寻找TSQL解决方案,它非常冗长,如this example所示。

一个较短的替代方法是使用SMO libraryexample

(我本来回答了这个here,但SQL Server,只有开发者可能不涉及该问题的标题对这一问题)

+0

感谢您的回复.. – 2010-11-18 10:41:58

2

使用此查询:

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>' 
+0

脚本的来源?有什么限制(它会处理外部键,触发器等)? – 2013-10-30 08:58:40

+0

@clickstefan:在这个问题中'@Pankaj Agarwal'想创建表格script.for生成触发器脚本,我会发送另一个答案。 – 2013-10-30 10:05:43

+0

@clickstefan:使用此链接查找数据库中的所有triger:http://stackoverflow.com/questions/13200511/how-to-generate-scripts-for-all-triggers-in-database-using-microsoft-sql-服务器 – 2013-10-30 10:41:55

3

用于生成CREATE TABLE语句索引,触发器和约束更完整的(-ish)解决方案试图通过洛厄尔伊萨吉雷作出的stored procedure

它已经过测试,并自2004年开发的,上次更新是在2013年

,我也做了一些改进,包括指数期权(PAD_INDEXFILLFACTORIGNORE_DUP_KEY):

这里的变化,不能适合所有的代码,所以你可以在http://pastebin.com/LXpBeuN1找到完整的修改版本。


更新

我已经谈过洛厄尔和新版本将在网上很快与指数期权和其他改进的新变化。

相关问题