创建同一批次的几个SQL视图

问题描述 投票:0回答:3

我尝试运行谁创建特定数据库的每个表的视图的脚本。我发现这个链接:How to create view for all tables in database?

显然,为了工作,我需要添加“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)

所以打印结果是什么,我希望:

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

但EXEC行返回:

消息156,级别15,状态1,过程*****,行3 [批量开始线0] 关键字附近的不正确语法“创建”。

消息111,级别15,状态1,过程*****,行3 [批量开始线0] “CREATE VIEW”必须是查询批次中的第一个语句。

消息111,级别15,状态1,过程*****,行5 [批量开始线0] “CREATE VIEW”必须是查询批次中的第一个语句。

消息111,级别15,状态1,过程*****,行7 [批量开始线0]

我应该创建一个模式?任何解决我的问题?

非常感谢你

sql tsql view create-view
3个回答
0
投票

使用光标和EXECUTE sp_executesql的似乎工作

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
投票

好了,最后我做了什么,你们建议我创建了一个光标,和它的作品。谢谢。

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 ' +@TableName +';')
    FETCH NEXT FROM @TableCursor INTO @TableName;
END

CLOSE @TableCursor
DEALLOCATE @TableCursor 

0
投票

你应该使用这样的语法:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [schema].[viewname] AS
SELECT * FROM schema.table

GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [schema].[viewname] AS
SELECT * FROM schema.table

GO

例如 :

SELECT 
'SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' AS 
SELECT * FROM ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' 

GO 
'
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

不要忘记输出的结果作为文本格式(CTRL + T在SQL服务器管理工​​作室。),因为它会继续回车。

对于这种情况,你可以生成一个脚本来检查SQL Server如何处理你的脚本。只需右键点击你的数据库,任务,生成脚本并按照助手。它将输出你到底是SQL服务器等待它的文件。

© www.soinside.com 2019 - 2024. All rights reserved.