【问题标题】:I want to create View from the system tables我想从系统表创建视图
【发布时间】:2021-09-20 21:12:57
【问题描述】:

我想从系统表中创建一个视图,我可以输出我想运行的语法,但是我怎么能运行那个输出命令呢? 我创建了以下查询,它输出创建表的语法

SELECT

'CREATE VIEW [Uti_John].[Vw_' + x.table_name +']' +
' AS SELECT * FROM [' + x.schema_name + '].[' + x.table_name +']' 
FROM
(
SELECT SCHEMA_NAME(schema_id) AS schema_name  
       ,name AS table_name   
FROM sys.tables 
WHERE name like 'T%' 
and SCHEMA_NAME(schema_id) = 'dbo'
) x

输出

CREATE VIEW [Uti_John].[Vw_TNAME] AS SELECT * FROM [dbo].[TNAME]
CREATE VIEW [Uti_John].[Vw_TClient] AS SELECT * FROM [dbo].[TClient]
CREATE VIEW [Uti_John].[Vw_TClaim] AS SELECT * FROM [dbo].[TTClaim]
CREATE VIEW [Uti_John].[Vw_TInsurance] AS SELECT * FROM [dbo].[TTInsurance]
CREATE VIEW [Uti_John].[Vw_Ttest] AS SELECT * FROM [dbo].[Ttest]

手动逐一复制此输出会创建视图,但我如何在循环中运行此输出并自动创建?

【问题讨论】:

  • 你别无选择,只能将它们输出到临时表中,然后使用while循环一一执行。同一批次中不能有多个CREATE VIEW
  • 使用游标和动态 SQL。
  • 突触不支持光标
  • 我使用了以下代码,它可以打印第一个视图,但它进入循环并且问题是第一个视图已经创建。我不确定如何添加条件如果不存在则执行此条件
  • 提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用 QuoteName() 以避免出现奇怪名称的问题,例如New Table 带有空格或保留字,例如 From

标签: tsql azure-synapse


【解决方案1】:

您可以使用sys.views 视图检查该视图是否已存在。

DECLARE  @SQL NVARCHAR(max)='*';

WHILE @SQL IS NOT NULL
BEGIN 

    SET @SQL = NULL;

    SELECT @SQL = 
    'CREATE VIEW [Uti_John].[Vw_' + x.table_name +']' +
    ' AS SELECT * FROM [' + x.schema_name + '].[' + x.table_name +']' 
    FROM
    (
        SELECT SCHEMA_NAME(schema_id) AS schema_name  
               ,t.name AS table_name   
        FROM sys.tables t
        WHERE t.name like 't%' 
        and SCHEMA_NAME(t.schema_id) = 'dbo'
        AND NOT EXISTS (    SELECT * 
                            FROM sys.views v 
                            WHERE v.name = 'Vw_' + t.name 
                            AND OBJECT_SCHEMA_NAME(v.object_id) = 'Uti_John'
                        )
    ) x

    EXEC sp_executesql @SQL;

    PRINT @SQL;

END ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多