2017-03-17 97 views
3

我有以下情况:我正在处理数据库中包含数百个表的项目,并且我经常知道需要为哪个表生成脚本,但是在列表中找到它所有表格都需要很长时间。我想知道,有没有办法编写脚本来生成表格的脚本。由于我已经知道表名,所以输入它比在类似名称的大列表中搜索它更容易。用于为表格生成脚本的SQL服务器脚本

+2

展鹏有一个免费的SQL搜索工具,可以让你搜索当你从搜索结果中选择对象时,将会拉起数据库对象定义http://www.red-gate.com/products/sql-development/sql-search/ – mallan1121

+2

如果你真的可以在对象浏览器中使用过滤功能需要。只需右键单击“表”并选择过滤器 - >过滤器设置。 FWIW我感觉你的痛苦。我有一个很痛苦的系统。在老式RPG系统中有超过4000张桌子和名字开始,所以每张桌子都有6个字符的名字,都是大写字母。 –

+1

请在DBA Stack Exchange站点上查看此问题/答案:http://dba.stackexchange.com/questions/53085/is-there-a-way-to-generate-table-create-script-in-tsql –

回答

1

是的,你绝对可以编写自己的程序来生成,这将作为参数提供给定的表名的脚本。在我的例子,我路过“dbo.TABLE1”作为参数传递给这个查询: (你可以用这个到存储过程中,当然)

DECLARE 
    @object_name SYSNAME = 'dbo.TABLE1' 
, @object_id INT = object_id('dbo.TABLE1') 
, @SQL NVARCHAR(MAX) 

SELECT 
    @object_name = '[' + OBJECT_SCHEMA_NAME(o.[object_id]) + '].[' +  OBJECT_NAME([object_id]) + ']' 
, @object_id = [object_id] 
FROM (SELECT [object_id] = @object_id) o 



SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) +  STUFF(( 
SELECT CHAR(13) + ' , [' + c.name + '] ' + 
    CASE WHEN c.is_computed = 1 
     THEN 'AS ' + OBJECT_DEFINITION(c.[object_id], c.column_id) 
     ELSE 
      CASE WHEN c.system_type_id != c.user_type_id 
       THEN '[' + SCHEMA_NAME(tp.[schema_id]) + '].[' + tp.name +  ']' 
       ELSE '[' + UPPER(tp.name) + ']' 
      END + 
      CASE 
       WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary') 
        THEN '(' + CASE WHEN c.max_length = -1 
            THEN 'MAX' 
            ELSE CAST(c.max_length AS VARCHAR(5)) 
           END + ')' 
       WHEN tp.name IN ('nvarchar', 'nchar') 
        THEN '(' + CASE WHEN c.max_length = -1 
            THEN 'MAX' 
            ELSE CAST(c.max_length/2 AS VARCHAR(5)) 
           END + ')' 
       WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset') 
        THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')' 
       WHEN tp.name = 'decimal' 
        THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')' 
       ELSE '' 
      END + 
      CASE WHEN c.collation_name IS NOT NULL AND c.system_type_id = c.user_type_id 
       THEN ' COLLATE ' + c.collation_name 
       ELSE '' 
      END + 
      CASE WHEN c.is_nullable = 1 
       THEN ' NULL' 
       ELSE ' NOT NULL' 
      END + 
      CASE WHEN c.default_object_id != 0 
       THEN ' CONSTRAINT [' + OBJECT_NAME(c.default_object_id) + ']' + 
        ' DEFAULT ' + OBJECT_DEFINITION(c.default_object_id) 
       ELSE '' 
      END + 
      CASE WHEN cc.[object_id] IS NOT NULL 
       THEN ' CONSTRAINT [' + cc.name + '] CHECK ' + cc.[definition] 
       ELSE '' 
      END + 
      CASE WHEN c.is_identity = 1 
       THEN ' IDENTITY(' + CAST(IDENTITYPROPERTY(c.[object_id], 'SeedValue') AS VARCHAR(5)) + ',' + 
           CAST(IDENTITYPROPERTY(c.[object_id], 'IncrementValue') AS VARCHAR(5)) + ')' 
       ELSE '' 
      END 
    END 
FROM sys.columns c WITH(NOLOCK) 
JOIN sys.types tp WITH(NOLOCK) ON c.user_type_id = tp.user_type_id 
LEFT JOIN sys.check_constraints cc WITH(NOLOCK) 
    ON c.[object_id] = cc.parent_object_id 
    AND cc.parent_column_id = c.column_id 
WHERE c.[object_id] = @object_id 
ORDER BY c.column_id 
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 7, '  ') + 
ISNULL((SELECT ' 
, CONSTRAINT [' + i.name + '] PRIMARY KEY ' + 
CASE WHEN i.index_id = 1 
    THEN 'CLUSTERED' 
    ELSE 'NONCLUSTERED' 
END +' (' + ( 
SELECT STUFF(CAST(( 
    SELECT ', [' + COL_NAME(ic.[object_id], ic.column_id) + ']' + 
      CASE WHEN ic.is_descending_key = 1 
       THEN ' DESC' 
       ELSE '' 
      END 
    FROM sys.index_columns ic WITH(NOLOCK) 
    WHERE i.[object_id] = ic.[object_id] 
     AND i.index_id = ic.index_id 
    FOR XML PATH(N''), TYPE) AS NVARCHAR(MAX)), 1, 2, '')) + ')' 
FROM sys.indexes i WITH(NOLOCK) 
WHERE i.[object_id] = @object_id 
    AND i.is_primary_key = 1), '') + CHAR(13) + ');' 

SELECT @SQL