Sql Server эквивалентен Oracle CREATE ИЛИ REPLACE VIEW
В Oracle я могу воссоздать представление с помощью одного оператора, как показано здесь:
CREATE OR REPLACE VIEW MY_VIEW AS
SELECT SOME_FIELD
FROM SOME_TABLE
WHERE SOME_CONDITIONS
Как следует из синтаксиса, это приведет к отбрасыванию старого представления и воссозданию его с любым определением, которое я дал.
Есть ли эквивалент в SQL Server 2005, который будет делать то же самое?
Ответы
Ответ 1
Вышеупомянутые решения, хотя они и сделают эту работу, рискуют отказаться от прав пользователя. Я предпочитаю делать свои создания или заменять виды или хранимые процедуры следующим образом.
IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vw_myView]'))
EXEC sp_executesql N'CREATE VIEW [dbo].[vw_myView] AS SELECT ''This is a code stub which will be replaced by an Alter Statement'' as [code_stub]'
GO
ALTER VIEW [dbo].[vw_myView]
AS
SELECT 'This is a code which should be replaced by the real code for your view' as [real_code]
GO
Ответ 2
Вы можете использовать "IF EXISTS", чтобы проверить, существует ли представление и отбрасывается ли оно.
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'MyView')
DROP VIEW MyView
GO
CREATE VIEW MyView
AS
....
GO
Ответ 3
Для справки от SQL Server 2016 SP1+
вы можете использовать синтаксис CREATE OR ALTER VIEW
.
MSDN CREATE VIEW:
CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[ ; ]
ИЛИ ALTER
Условно изменяет представление только в том случае, если оно уже существует.
Ответ 4
Я использую:
IF OBJECT_ID('[dbo].[myView]') IS NOT NULL
DROP VIEW [dbo].[myView]
GO
CREATE VIEW [dbo].[myView]
AS
...
Недавно я добавил некоторые утилиты для такого рода вещей:
CREATE PROCEDURE dbo.DropView
@ASchema VARCHAR(100),
@AView VARCHAR(100)
AS
BEGIN
DECLARE @sql VARCHAR(1000);
IF OBJECT_ID('[' + @ASchema + '].[' + @AView + ']') IS NOT NULL
BEGIN
SET @sql = 'DROP VIEW ' + '[' + @ASchema + '].[' + @AView + '] ';
EXEC(@sql);
END
END
Итак, теперь пишу
EXEC dbo.DropView 'mySchema', 'myView'
GO
CREATE View myView
...
GO
Я думаю, что мои записи изменений немного читаемы
Ответ 5
Я обычно использую что-то вроде этого:
if exists (select * from dbo.sysobjects
where id = object_id(N'dbo.MyView') and
OBJECTPROPERTY(id, N'IsView') = 1)
drop view dbo.MyView
go
create view dbo.MyView [...]
Ответ 6
С SQL Server 2016 вы имеете
DROP TABLE IF EXISTS [foo];
Источник MSDN
Ответ 7
Вы можете использовать ALTER для обновления представления, но это отличается от команды Oracle, поскольку она работает только в том случае, если представление уже существует. Вероятно, лучше с ответом DaveK, так как это всегда будет работать.
Ответ 8
Он отлично работает для меня на SQL Server 2017:
USE MSSQLTipsDemo
GO
CREATE OR ALTER PROC CreateOrAlterDemo
AS
BEGIN
SELECT TOP 10 * FROM [dbo].[CountryInfoNew]
END
GO
https://www.mssqltips.com/sqlservertip/4640/new-create-or-alter-statement-in-