2016-06-01 18 views
0

我需要得到表通過query.is這可能創建腳本,通過傳遞表和數據庫名稱作爲變量來獲得腳本..如何獲得表中創建腳本動態

+0

這個問題已經在這裏問:http://stackoverflow.com/questions/4213687/how-to-generate-create-script-of-table-using-sql-query-in-sql-server – rverdelli

+0

@rverdelli我已經看到了這一個。我的要求是表名和數據庫名稱我試圖通過作爲輸入參數它應該返回腳本..您在上面提到的頁面我們無法傳遞數據庫名稱... –

回答

0

這個TSQL

DECLARE @table_name SYSNAME 

SELECT @table_name = 'dbo.tablename' 

DECLARE @object_name SYSNAME 
    ,@object_id INT 

SELECT @object_name = '[' + s.NAME + '].[' + o.NAME + ']' 
    ,@object_id = o.[object_id] 
FROM sys.objects o WITH (NOWAIT) 
JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id] 
WHERE s.NAME + '.' + o.NAME = @table_name 
    AND o.[type] = 'U' 
    AND o.is_ms_shipped = 0 

DECLARE @SQL NVARCHAR(MAX) = ''; 

WITH index_column 
AS (
    SELECT ic.[object_id] 
     ,ic.index_id 
     ,ic.is_descending_key 
     ,ic.is_included_column 
     ,c.NAME 
    FROM sys.index_columns ic WITH (NOWAIT) 
    JOIN sys.columns c WITH (NOWAIT) ON ic.[object_id] = c.[object_id] 
     AND ic.column_id = c.column_id 
    WHERE ic.[object_id] = @object_id 
    ) 
    ,fk_columns 
AS (
    SELECT k.constraint_object_id 
     ,cname = c.NAME 
     ,rcname = rc.NAME 
    FROM sys.foreign_key_columns k WITH (NOWAIT) 
    JOIN sys.columns rc WITH (NOWAIT) ON rc.[object_id] = k.referenced_object_id 
     AND rc.column_id = k.referenced_column_id 
    JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = k.parent_object_id 
     AND c.column_id = k.parent_column_id 
    WHERE k.parent_object_id = @object_id 
    ) 
SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) + STUFF((
      SELECT CHAR(9) + ', [' + c.NAME + '] ' + CASE 
        WHEN c.is_computed = 1 
         THEN 'AS ' + cc.[definition] 
        ELSE UPPER(tp.NAME) + CASE 
          WHEN tp.NAME IN (
            'varchar' 
            ,'char' 
            ,'varbinary' 
            ,'binary' 
            ,'text' 
            ) 
           THEN '(' + CASE 
             WHEN c.max_length = - 1 
              THEN 'MAX' 
             ELSE CAST(c.max_length AS VARCHAR(5)) 
             END + ')' 
          WHEN tp.NAME IN (
            'nvarchar' 
            ,'nchar' 
            ,'ntext' 
            ) 
           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 
           THEN ' COLLATE ' + c.collation_name 
          ELSE '' 
          END + CASE 
          WHEN c.is_nullable = 1 
           THEN ' NULL' 
          ELSE ' NOT NULL' 
          END + CASE 
          WHEN dc.[definition] IS NOT NULL 
           THEN ' DEFAULT' + dc.[definition] 
          ELSE '' 
          END + CASE 
          WHEN ic.is_identity = 1 
           THEN ' IDENTITY(' + CAST(ISNULL(ic.seed_value, '0') AS CHAR(1)) + ',' + CAST(ISNULL(ic.increment_value, '1') AS CHAR(1)) + ')' 
          ELSE '' 
          END 
        END + CHAR(13) 
      FROM sys.columns c WITH (NOWAIT) 
      JOIN sys.types tp WITH (NOWAIT) ON c.user_type_id = tp.user_type_id 
      LEFT JOIN sys.computed_columns cc WITH (NOWAIT) ON c.[object_id] = cc.[object_id] 
       AND c.column_id = cc.column_id 
      LEFT JOIN sys.default_constraints dc WITH (NOWAIT) ON c.default_object_id != 0 
       AND c.[object_id] = dc.parent_object_id 
       AND c.column_id = dc.parent_column_id 
      LEFT JOIN sys.identity_columns ic WITH (NOWAIT) ON c.is_identity = 1 
       AND c.[object_id] = ic.[object_id] 
       AND c.column_id = ic.column_id 
      WHERE c.[object_id] = @object_id 
      ORDER BY c.column_id 
      FOR XML PATH('') 
       ,TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(9) + ' ') + ISNULL((
      SELECT CHAR(9) + ', CONSTRAINT [' + k.NAME + '] PRIMARY KEY (' + (
        SELECT STUFF((
           SELECT ', [' + c.NAME + '] ' + CASE 
             WHEN ic.is_descending_key = 1 
              THEN 'DESC' 
             ELSE 'ASC' 
             END 
           FROM sys.index_columns ic WITH (NOWAIT) 
           JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = ic.[object_id] 
            AND c.column_id = ic.column_id 
           WHERE ic.is_included_column = 0 
            AND ic.[object_id] = k.parent_object_id 
            AND ic.index_id = k.unique_index_id 
           FOR XML PATH(N'') 
            ,TYPE 
           ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
        ) + ')' + CHAR(13) 
      FROM sys.key_constraints k WITH (NOWAIT) 
      WHERE k.parent_object_id = @object_id 
       AND k.[type] = 'PK' 
      ), '') + ')' + CHAR(13) + ISNULL((
      SELECT (
        SELECT CHAR(13) + 'ALTER TABLE ' + @object_name + ' WITH' + CASE 
          WHEN fk.is_not_trusted = 1 
           THEN ' NOCHECK' 
          ELSE ' CHECK' 
          END + ' ADD CONSTRAINT [' + fk.NAME + '] FOREIGN KEY(' + STUFF((
           SELECT ', [' + k.cname + ']' 
           FROM fk_columns k 
           WHERE k.constraint_object_id = fk.[object_id] 
           FOR XML PATH('') 
            ,TYPE 
           ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')' + ' REFERENCES [' + SCHEMA_NAME(ro.[schema_id]) + '].[' + ro.NAME + '] (' + STUFF((
           SELECT ', [' + k.rcname + ']' 
           FROM fk_columns k 
           WHERE k.constraint_object_id = fk.[object_id] 
           FOR XML PATH('') 
            ,TYPE 
           ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')' + CASE 
          WHEN fk.delete_referential_action = 1 
           THEN ' ON DELETE CASCADE' 
          WHEN fk.delete_referential_action = 2 
           THEN ' ON DELETE SET NULL' 
          WHEN fk.delete_referential_action = 3 
           THEN ' ON DELETE SET DEFAULT' 
          ELSE '' 
          END + CASE 
          WHEN fk.update_referential_action = 1 
           THEN ' ON UPDATE CASCADE' 
          WHEN fk.update_referential_action = 2 
           THEN ' ON UPDATE SET NULL' 
          WHEN fk.update_referential_action = 3 
           THEN ' ON UPDATE SET DEFAULT' 
          ELSE '' 
          END + CHAR(13) + 'ALTER TABLE ' + @object_name + ' CHECK CONSTRAINT [' + fk.NAME + ']' + CHAR(13) 
        FROM sys.foreign_keys fk WITH (NOWAIT) 
        JOIN sys.objects ro WITH (NOWAIT) ON ro.[object_id] = fk.referenced_object_id 
        WHERE fk.parent_object_id = @object_id 
        FOR XML PATH(N'') 
         ,TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
      ), '') + ISNULL((
      (
       SELECT CHAR(13) + 'CREATE' + CASE 
         WHEN i.is_unique = 1 
          THEN ' UNIQUE' 
         ELSE '' 
         END + ' NONCLUSTERED INDEX [' + i.NAME + '] ON ' + @object_name + ' (' + STUFF((
          SELECT ', [' + c.NAME + ']' + CASE 
            WHEN c.is_descending_key = 1 
             THEN ' DESC' 
            ELSE ' ASC' 
            END 
          FROM index_column c 
          WHERE c.is_included_column = 0 
           AND c.index_id = i.index_id 
          FOR XML PATH('') 
           ,TYPE 
          ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')' + ISNULL(CHAR(13) + 'INCLUDE (' + STUFF((
           SELECT ', [' + c.NAME + ']' 
           FROM index_column c 
           WHERE c.is_included_column = 1 
            AND c.index_id = i.index_id 
           FOR XML PATH('') 
            ,TYPE 
           ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')', '') + CHAR(13) 
       FROM sys.indexes i WITH (NOWAIT) 
       WHERE i.[object_id] = @object_id 
        AND i.is_primary_key = 0 
        AND i.[type] = 2 
       FOR XML PATH('') 
        ,TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
      ), '') 

PRINT @SQL 
嘗試