Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何检查视图是否存在,如果不存在,如何创建_Sql_Sql Server_Ssms_Sql Server 2016 - Fatal编程技术网

Sql 如何检查视图是否存在,如果不存在,如何创建

Sql 如何检查视图是否存在,如果不存在,如何创建,sql,sql-server,ssms,sql-server-2016,Sql,Sql Server,Ssms,Sql Server 2016,如果SQL Server 2016中不存在视图,我想创建一个视图 IF EXISTS(SELECT 1 FROM sys.views WHERE Name = 'VI_ALL_CITIES_AS_CATEGORY') BEGIN CREATE VIEW VI_ALL_CITIES_AS_CATEGORY AS SELECT PERSONS.FIRST_NAME AS 'Име', PERSONS.LAST_NAME AS 'Фамилия', CITIES.CITY_NAME

如果SQL Server 2016中不存在视图,我想创建一个视图

IF EXISTS(SELECT 1 FROM sys.views 
     WHERE Name = 'VI_ALL_CITIES_AS_CATEGORY')
BEGIN
CREATE VIEW VI_ALL_CITIES_AS_CATEGORY AS
    SELECT PERSONS.FIRST_NAME AS 'Име', PERSONS.LAST_NAME AS 'Фамилия', CITIES.CITY_NAME AS 'Град'
    FROM CITIES
    LEFT JOIN PERSONS ON CITIES.ID = PERSONS.CITY_ID ;
END
但它给了我一个错误:

语法不正确:“CREATE VIEW”必须是 一批

试试这个方法

IF NOT EXISTS
(
    SELECT 1
    FROM sys.views
    WHERE Name = 'VI_ALL_CITIES_AS_CATEGORY'
)
BEGIN

    EXEC('CREATE VIEW VI_ALL_CITIES_AS_CATEGORY AS SELECT 1 as Val')

END
GO

ALTER VIEW VI_ALL_CITIES_AS_CATEGORY
AS
SELECT 
    PERSONS.FIRST_NAME AS 'Име',
    PERSONS.LAST_NAME AS 'Фамилия',
    CITIES.CITY_NAME AS 'Град'
    FROM CITIES
       LEFT JOIN PERSONS 
          ON CITIES.ID = PERSONS.CITY_ID
您有两种选择:

1) 如果您使用的是SSM或任何可以将脚本拆分为不同批次的客户端:

IF EXISTS(SELECT 'view exists' FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'YourViewName'AND TABLE_SCHEMA = 'YourViewSchema')
BEGIN
    DROP VIEW YourViewSchema.YourViewName
END

GO -- This will make the next statement the first in it's batch

CREATE VIEW YourViewSchema.YourViewName AS
SELECT something = 1
FROM YourTable

GO
2) 如果无法将代码拆分为批处理,则必须使用动态SQL“愚弄”引擎以创建视图:

 IF NOT EXISTS(SELECT 'view exists' FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'YourViewName'AND TABLE_SCHEMA = 'YourViewSchema')
    BEGIN
        DECLARE @v_ViewCreateStatement VARCHAR(MAX) = '
            CREATE VIEW YourViewSchema.YourViewName AS
                SELECT something = 1
                FROM YourTable'

        EXEC (@v_ViewCreateStatement)

    END
请注意,1)如果存在,则为
;2)如果不存在,则为


这是因为大多数DDL语句需要在批处理中放在第一位,所以很遗憾,您不能将
CREATE
对象语句放在其他语句之后。

除非我读错了您的SQL,否则您的
EXISTS
正在检查是否存在,然后您尝试
创建它。如果视图已经存在,则<代码>创建/代码>将失败。另一种解决方案:<代码> SET NOExEC :在中间有一个GO语句,请记住,如果该代码位于存储过程中,这将不起作用。