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

Lyu*_*rov 3 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 AS '????'
    FROM CITIES
    LEFT JOIN PERSONS ON CITIES.ID = PERSONS.CITY_ID ;
END
Run Code Online (Sandbox Code Playgroud)

但它给了我错误:

语法不正确:“CREATE VIEW”必须是批处理中的唯一语句。

Jay*_*esh 7

尝试这个方法

\n\n
IF NOT EXISTS\n(\n    SELECT 1\n    FROM sys.views\n    WHERE Name = 'VI_ALL_CITIES_AS_CATEGORY'\n)\nBEGIN\n\n    EXEC('CREATE VIEW VI_ALL_CITIES_AS_CATEGORY AS SELECT 1 as Val')\n\nEND\nGO\n\nALTER VIEW VI_ALL_CITIES_AS_CATEGORY\nAS\nSELECT \n    PERSONS.FIRST_NAME AS '\xd0\x98\xd0\xbc\xd0\xb5',\n    PERSONS.LAST_NAME AS '\xd0\xa4\xd0\xb0\xd0\xbc\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x8f',\n    CITIES.CITY_NAME AS '\xd0\x93\xd1\x80\xd0\xb0\xd0\xb4'\n    FROM CITIES\n       LEFT JOIN PERSONS \n          ON CITIES.ID = PERSONS.CITY_ID\n
Run Code Online (Sandbox Code Playgroud)\n

  • 中间有一个 GO 语句,请记住,例如,如果此代码位于存储过程中,则该语句将不起作用。 (2认同)

EzL*_*zLo 5

您有 2 个选择:

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,1) 是一个IF EXISTS,2) 是一个IF NOT EXISTS

这样做的原因是大多数 DDL 语句需要在批处理中放在最前面,因此很CREATE遗憾,您不能将对象语句放在其他语句之后。