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”必须是批处理中的唯一语句。
尝试这个方法
\n\nIF 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\nRun Code Online (Sandbox Code Playgroud)\n
您有 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遗憾,您不能将对象语句放在其他语句之后。