create sql sql-server view porting

¿Cómo hacer que CREATE O REPLACE VIEW funcione en SQL Server?



sql select view (8)

Esta pregunta ya tiene una respuesta aquí:

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

Referencia de MSDN


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