2017-12-14 15 views
0

特定のデータベースの各テーブルのビューを作成するスクリプトを実行しようとしました。 私は、このリンクが見つかりました: How to create view for all tables in database?複数のビューをSQLで同じバッチで作成

を明らかにして、動作するために、私は「GO」ステートメントとキャリッジリターンを追加する必要があります。

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 

が、幹部の行が返されます:だから、ここで私は、印刷結果は、私が期待するものである

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) 

をやったことある

メッセージ156、レベル15、状態1、プロシージャ*****、行3 [バッチ開始行0]
キーワード 'CREATE'の近くに構文が正しくありません。

レベル15、状態1、プロシージャ*****、行3 [バッチ開始行0]
'CREATE VIEW'は、クエリバッチの最初の文でなければなりません。

レベル11、状態1、プロシージャ*****、行5 [バッチ開始行0]
'CREATE VIEW'は、クエリバッチの最初の文でなければなりません。

メッセージ111、レベル15、状態1、プロシージャ*****、7行[バッチスタートライン0]

は、私は、スキーマを作成する必要がありますか?私の問題に対する解決策はありますか?

カーソルを使用して非常に

+1

これは、カーソルが実際に役立つ1つの場所です。すべてのテーブルを繰り返し処理して、一度に1つの 'CREATE VIEW'を実行することが簡単になります。キャリッジリターンなどでフープをジャンプする必要はありません。また、' SELECT * FROM blah'を使用しないでください。いつもあらゆる分野を何らかの方法で取り入れていますか?最後に、DECLARE @GO NVARCHAR(MAX)= CHAR(13)+ CHAR(10)+ 'GO' + CHAR(13)+ CHAR(10);を使用し、最後に '@GO'を追加する各明細書の? – MatBailie

+0

また、名前が長すぎる可能性があります。 'SELECT length、COUNT(*)FROM(SELECT LEN(name)length from sys.tables WHERE schema_id = 1)name_lengths GROUP BY length ORDER BY length;'すでに最大名前長のテーブル名があるかどうかを調べるには? *(128から2008年、それ以降は256)* – MatBailie

+0

@MatBailie:あなたのアドバイスのために大変ありがとうございます。まず問題は長さから来ているとは思えません。 "Go"についての良い考え;)私はカーソルで試してみるが、それほどよく分からないが、私はそれらをGoogle上でどのように使うかをチェックする;) – Json

答えて

0

をありがとうとsp_executesqlをを実行するには、OK

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

私はすでにセミコロン(;)を試してみましたが、どちらもうまくいきません。カーソルで試してみます:) – Json

0

を動作しているようです、だから、最終的に私はあなたたちが提案し、私は、カーソルを作成した何をした、そしてそれ働くありがとうございました。

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

select *に注意してください。テーブルの途中にカラムを追加すると、ビューが間違ったカラムを返す可能性があります – Ezin82

+0

シノニムを見てみましょう。 。 [link](https://docs.microsoft.com/it-it/sql/t-sql/statements/create-synonym-transact-sql) – Ezin82

関連する問題