2017-03-17 93 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