2017-12-14 12 views
0

Ich versuche, ein Skript auszuführen, die eine Sicht für jede Tabelle einer bestimmten Datenbank erstellen. Ich fand diesen Link: How to create view for all tables in database?Erstellen Sie mehrere Ansichten in derselben Charge in SQL

und anscheinend, um mich zu arbeiten, um die ‚GO‘ Erklärung und einen Wagenrücklauf hinzufügen müssen. Also hier ist, was ich tat

DECLARE @SQL NVARCHAR(MAX) 
SET @SQL = '' 

SELECT 
    @SQL = @SQL+ 
    N'CREATE VIEW [v2_' + t.name + N'] AS SELECT ' + 
     STUFF(
      (SELECT N',' + c.name 
       FROM 
        sys.columns AS c 
       WHERE 
       c.OBJECT_ID = t.OBJECT_ID 
       ORDER BY 
       column_id 
       FOR XML PATH(''), TYPE).value('.',N'nvarchar(max)') 
     ,1,1,N'') 
     + N' FROM [' + t.name + N'] [\r\n]go[\r\n]' 

FROM 
    sys.tables AS t 
WHERE 
    t.schema_id ='1' 

SET @SQL = REPLACE(@SQL,'[\r\n]',CHAR(13)+CHAR(10)) 
PRINT @SQL 

EXECUTE (@SQL) 

So ist das Druckergebnis, was ich erwarten:

CREATE VIEW ***** AS SELECT Parent_Path,id,a2ea,userLabel,DATE,HEURE,REF_EQT,COMMANDE_REF,LOG FROM ***** 
go 
CREATE VIEW ***** AS SELECT AlarmIdentifier,Class,Category,Time,ObjectOfReference,AlarmText,DATE,HEURE,REF_EQT,SS_EQT,Carte_EQT,COMMANDE_REF,LOG FROM ***** 
go 
CREATE VIEW ***** AS SELECT CELL,MCC,MNC,LAC,CID,BSC,CO,EA,RO,NCS,DATE,HEURE,REF_EQT,SS_EQT,Carte_EQT,COMMANDE_REF,LOG FROM ***** 
go 
CREATE VIEW ***** AS SELECT RNC,RNCID,R1,R2,GLCNID,RNCCODEC,TB,DATE,HEURE,REF_EQT,SS_EQT,Carte_EQT,COMMANDE_REF,LOG FROM ***** 
go 
CREATE VIEW ***** AS SELECT MGG,MG,RESTRICTED,DEFAULT,MISC,MGP,WF,DATE,HEURE,REF_EQT,SS_EQT,Carte_EQT,COMMANDE_REF,LOG FROM [NRGGP] 
go 
CREATE VIEW ***** AS SELECT SNT,SNTV,SNTP,DIP,DEV,DEVP,SNTINL,EQLEV,PROT,SDIP,SUBSNT,DEFPST,EXTP,MG,DATE,HEURE,REF_EQT,COMMANDE_REF,LOG FROM ***** 
go 
CREATE VIEW ***** AS SELECT RefreshLog_Id,Date,Etat,DateTransfert,Transfert FROM ***** 
go 

aber die exec Linie zurück:

Msg 156, Ebene 15, Status 1, Prozedur *****, Zeile 3 [Batch Start Line 0]
Falsche Syntax in der Nähe des Schlüsselwortes 'CREATE'.

Msg 111, Ebene 15, Status 1, Prozedur *****, Zeile 3 [Start Charge Zeile 0]
'CREATE VIEW' muss die erste Anweisung in einem Abfragebatch sein.

Msg 111, Ebene 15, Status 1, Prozedur *****, Zeile 5 [Start Charge Zeile 0]
'CREATE VIEW' muss die erste Anweisung in einem Abfragebatch sein.

Msg 111, Ebene 15, Status 1, Prozedur *****, Zeile 7 [Start Charge Zeile 0]

Sollte erstelle ich ein Schema? Irgendeine Lösung für mein Problem?

Vielen Dank

+1

Dies ist ein Ort, an dem ein Cursor Ihnen tatsächlich helfen kann. Es wird es einfacher machen, durch alle Tabellen zu iterieren und nur eine "CREATE VIEW" zu einem Zeitpunkt auszuführen, ohne dass man durch Schleifen mit Wagenrückläufen usw. springen muss. Auch, warum nicht einfach SELECT * FROM blah verwenden Gibt es immer ein beliebiges Feld? Schließlich, warum nicht einfach 'DECLARE @ GO NVARCHAR (MAX) = CHAR (13) + CHAR (10) + 'GO' + CHAR (13) + CHAR (10);' und dann '@ GO' an das Ende anhängen von jeder Aussage? – MatBailie

+0

Es ist auch möglich, dass Sie einen Namen haben, der zu lang ist. Probieren Sie 'SELECT length, COUNT (*) FROM aus (SELECT LEN (Name) length FROM sys.tables WHERE schema_id = 1) name_lengths GROUP BY Länge ORDER BY length;' um zu sehen, ob Sie bereits Tabellennamen mit maximaler Namenslänge haben? * (128 bis 2008, und 256 von da an.) * – MatBailie

+0

@MatBailie: Vielen Dank für Ihre Ratschläge, zuerst glaube ich nicht, dass das Problem von der Länge kommt. Gute Idee über das "Go";) Ich werde mit einem Cursor versuchen, ich kenne sie nicht viel, aber ich werde überprüfen, wie man sie bei Google verwendet;) – Json

Antwort

0

ein Cursor und EXECUTE Sp_executesql Mit

DECLARE @SQL NVARCHAR(MAX) 
     , @table_id INT 
SET @SQL = '' 

DECLARE CUR CURSOR LOCAL FAST_FORWARD FOR 
SELECT t.object_id FROM sys.tables AS t 
WHERE t.schema_id ='1' 

OPEN CUR 

FETCH NEXT FROM cur INTO @table_id 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @SQL = N'CREATE VIEW [v2_' + t.name + N'] AS SELECT ' + 
      STUFF(
       (SELECT N',' + c.name 
        FROM 
         sys.columns AS c 
        WHERE 
        c.OBJECT_ID = t.OBJECT_ID 
        ORDER BY 
        column_id 
        FOR XML PATH(''), TYPE).value('.',N'nvarchar(max)') 
      ,1,1,N'') 
      + N' FROM [' + t.name + N'];' 
    FROM 
     sys.tables AS t 
    WHERE t.object_id = @table_id 

    PRINT @SQL 
    --EXECUTE sp_executesql @SQL 
    FETCH NEXT FROM cur INTO @table_id 
END 

CLOSE CUR 

DEALLOCATE CUR 
+0

habe ich schon mit einem Semikolon (;) versucht aber es geht auch nicht.Ich werde versuchen, mit einem Cursor :) – Json

0

Ok scheint zu funktionieren, also schließlich tat ich, was euch vorgeschlagen und ich erstellt einen Cursor, und es funktioniert. Vielen Dank.

DECLARE @TableName as NVARCHAR(50) 
DECLARE @TableCursor as CURSOR 

SET @TableCursor = CURSOR FOR 
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA = 'dbo'; 

OPEN @TableCursor; 

FETCH NEXT FROM @TableCursor INTO @TableName; 

While @@FETCH_STATUS = 0 

BEGIN 
    EXEC ('create view '+ @TableName+'_V2 
    as select * from ' [email protected] +';') 
    FETCH NEXT FROM @TableCursor INTO @TableName; 
END 

CLOSE @TableCursor 
DEALLOCATE @TableCursor 
+0

Seien Sie vorsichtig mit Auswahl *, wenn Sie eine Spalte in der Mitte einer Tabelle hinzufügen Ihre Ansichten möglicherweise falsche Spalten – Ezin82

+0

Werfen Sie einen Blick auf Synonyme, sie können besser sein als verwenden Ansicht mit auswählen * . [link] (https://docs.microsoft.com/it-it/sql/t-sql/statements/create-synonym-transact-sql) – Ezin82

Verwandte Themen