2017-03-17 7 views
3

Ich habe folgende Situation: Ich arbeite an einem Projekt wo Datenbank Hunderte von Tabellen enthält, und sehr oft weiß ich, welche Tabelle ich für Skript generieren muss, aber es in der Liste finden von allen Tabellen braucht viel Zeit. Ich würde gerne wissen, gibt es eine Möglichkeit, Skript zu schreiben, die Skript für Tabelle generieren wird. Da ich den Tabellennamen bereits kenne, ist es einfacher für mich, ihn einfach einzugeben, als ihn in einer riesigen Liste ähnlicher Namen zu suchen.SQL-Server-Skript zum Generieren von Skript für Tabelle

+2

RedGate eine kostenlose SQL Suchwerkzeug hat, mit dem Sie suchen, und wird eine Datenbankobjektdefinition aufrufen, wenn Sie das Objekt aus den Suchergebnissen auswählen http://www.red-gate.com/products/sql-development/sql-search/ – mallan1121

+2

Sie können die Filterung im Objekt-Explorer verwenden, wenn Sie wirklich müssen. Klicken Sie einfach mit der rechten Maustaste auf "Tabellen" und wählen Sie Filter -> Filtereinstellungen. FWIW Ich fühle deinen Schmerz. Ich habe ein System, mit dem es schwer zu arbeiten ist. Es gibt über 4.000 Tabellen und die Namen wurden in einem alten Schul-RPG-System gestartet, so dass jede Tabelle genau 6 Zeichen im Namen hat und sie alle in Großbuchstaben geschrieben sind. –

+1

Siehe diese Frage/Antwort auf der DBA Stack Exchange-Website: http://dba.stackexchange.com/questions/53085/is-there-a-way-to-generate-table-create-script-in-tsql –

Antwort

1

Ja, können Sie auf jeden Fall Ihre eigene Prozedur schreiben, Skripte für einen bestimmten Tabellennamen zu erzeugen, die als Parameter zur Verfügung gestellt werden. In meinem Beispiel bin ich ‚dbo.Table1‘ als Parameter an diese Abfrage übergeben: (Sie dies in einer Stored Procedure wickeln kann, natürlich)

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 
Verwandte Themen