¿Cómo hacer que CREATE O REPLACE VIEW funcione en SQL Server?
sql select view (8)
Esta pregunta ya tiene una respuesta aquí:
- SQL Server equivalente a las respuestas CREAR O REEMPLAZAR DE Oracle 8
CREATE OR REPLACE VIEW
no parece funcionar en SQL Server. Entonces, ¿cómo puerto CREATE OR REPLACE VIEW
para trabajar en SQL Server?
Esto es lo que estoy tratando de hacer:
CREATE OR REPLACE VIEW data_VVVV AS
SELECT
VCV.xxxx,
VCV.yyyy AS yyyy,
VCV.zzzz AS zzzz
FROM
TABLE_A
;
¿Algunas ideas?
Respuesta de SQL Server 2016
Con SQL Server 2016 ahora puede hacer ( MSDN Source ):
DROP VIEW IF EXISTS dbo.MyView
¿Qué tal algo como esto, los comentarios deberían explicar:
--DJ - 2015-07-15 Example for view CREATE or REPLACE
--Replace with schema and view names
DECLARE @viewName NVARCHAR(30)= ''T'';
DECLARE @schemaName NVARCHAR(30)= ''dbo'';
--Leave this section as-is
BEGIN TRY
DECLARE @view AS NVARCHAR(100) = ''
CREATE VIEW '' + @schemaName + ''.'' + @viewName + '' AS SELECT '''''''' AS [1]'';
EXEC sp_executesql
@view;
END TRY
BEGIN CATCH
PRINT ''View already exists'';
END CATCH;
GO
--Put full select statement here after modifying the view & schema name appropriately
ALTER VIEW [dbo].[T]
AS
SELECT '''' AS [2];
GO
--Verify results with select statement against the view
SELECT *
FROM [T];
Saludos -DJ
Aquí hay otro método, en el que no tiene que duplicar el contenido de la vista:
IF (NOT EXISTS (SELECT 1 FROM sys.views WHERE name = ''data_VVV''))
BEGIN
EXECUTE(''CREATE VIEW data_VVVV as SELECT 1 as t'');
END;
GO
ALTER VIEW data_VVVV AS
SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A ;
Las primeras verificaciones de la existencia de la vista (hay otras formas de hacerlo). Si no existe, entonces créalo con algo simple y tonto. Si lo hace, simplemente continúe con la declaración de alter view
.
La modificación de una vista se puede realizar eliminando la vista y volviéndola a crear. Usa lo siguiente para soltar y recrear tu vista.
IF EXISTS
(SELECT NAME FROM SYS.VIEWS WHERE NAME = ''dbo.test_abc_def'')
DROP VIEW dbo.test_abc_def) go
CREATE VIEW dbo.test_abc_def AS
SELECT
VCV.xxxx,
VCV.yyyy AS yyyy
,VCV.zzzz AS zzzz
FROM TABLE_A
La solución aceptada tiene un problema con la necesidad de mantener la misma declaración dos veces, pero no es muy eficiente (aunque funciona). En teoría, la solución de Gordon Linoff sería la alternativa, excepto que no funciona en MSSQL porque la vista de creación debe ser la primera línea de un lote.
El drop / create no responde a la pregunta como se plantea. Lo siguiente hace el trabajo según la pregunta original.
if not exists (select * from sysobjects where name=''TABLE_A'' and xtype=''V'')
exec (''create view SELECT
VCV.xxxx,
VCV.yyyy AS yyyy,
VCV.zzzz AS zzzz
FROM TABLE_A'')
Tomando prestado de la respuesta de @ Khan, yo haría:
IF OBJECT_ID(''dbo.test_abc_def'', ''V'') IS NOT NULL
DROP VIEW dbo.test_abc_def
GO
CREATE VIEW dbo.test_abc_def AS
SELECT
VCV.xxxx
,VCV.yyyy AS yyyy
,VCV.zzzz AS zzzz
FROM TABLE_A
Edit: Aunque esta pregunta ha sido marcada como un duplicado, todavía ha estado recibiendo atención. La respuesta proporcionada por @JaKXz es correcta y debe ser la respuesta aceptada.
Tendrá que comprobar la existencia de la vista. Luego haga un CREATE VIEW
o ALTER VIEW
dependiendo del resultado.
IF OBJECT_ID(''dbo.data_VVVV'') IS NULL
BEGIN
CREATE VIEW dbo.data_VVVV
AS
SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
END
ELSE
ALTER VIEW dbo.data_VVVV
AS
SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
BEGIN
END
IF NOT EXISTS(select * FROM sys.views where name = ''data_VVVV '')
BEGIN
CREATE VIEW data_VVVV AS
SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
END
ELSE
BEGIN
ALTER VIEW data_VVVV AS
SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
END