2008-10-02 4 views
94

En Oracle, puedo volver a crear una vista con una sola instrucción, como se muestra aquí:servidor SQL equivalente para crear o sustituir la visión de Oracle

CREATE OR REPLACE VIEW MY_VIEW AS 
SELECT SOME_FIELD 
FROM SOME_TABLE 
WHERE SOME_CONDITIONS 

Como la sintaxis indica, este caerá la antigua visión y volver a crearlo con la definición que he dado.

¿Hay un equivalente en SQL Server 2005 que haga lo mismo?

Respuesta

90

Las soluciones anteriores, aunque harán el trabajo, lo harán a riesgo de perder los permisos de los usuarios. Prefiero hacer mi crear o reemplazar vistas o procedimientos almacenados de la siguiente manera.

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

Solía ​​ser una persona "soltada" y luego (re) "añadir". Pero ahora me inclino por este tipo de solución (agregue si no está allí, luego modifíquela). – granadaCoder

+0

Modificar una vista es mucho mejor que soltar y volver a crearlo. ¿Qué sucede si tienes una gran cantidad de usuarios existentes configurados para una vista de seguridad, entonces tendrías que volver a crearlos? Este es mi enfoque a este problema. – jonas

+0

Tus CREAR y ALTERAR hacen cosas diferentes ... ¿por qué? (La dinámica de uno, la del otro no, y tienen mensajes diferentes.) –

43

Puede usar 'IF EXISTS' para verificar si la vista existe y colocarla si lo hace.

 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = 'MyView') 
    DROP VIEW MyView 
GO 

CREATE VIEW MyView 
AS 
    .... 
GO 
+10

El problema con esto es que se pierde cualquier permiso que pueden haber existido en el objeto que nos dejó. – simon

6

Me suelen utilizar algo como esto:

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 [...] 
+0

Esto también funciona con procedimientos almacenados, tablas, etc. – Dave

2

Puede utilizar ALTER para actualizar una vista, pero esto es diferente que el comando de Oracle, ya que sólo funciona si la vista ya existe. Probablemente esté mejor con la respuesta de DaveK ya que eso siempre funcionará.

+1

Aunque ALTER mantiene los permisos existentes (y conserva la versión anterior si la nueva versión tiene errores de sintaxis, etc.). Por lo tanto, si utiliza IF NOT EXISTS ... para crear un Stub, y luego ALTER para reemplazarlo/original puede ser mejor para mantener los permisos y las dependencias. – Kristen

12

que utilizo:

IF OBJECT_ID('[dbo].[myView]') IS NOT NULL 
DROP VIEW [dbo].[myView] 
GO 
CREATE VIEW [dbo].[myView] 
AS 

...

Recientemente he añadido algunos procedimientos de utilidad para este tipo de cosas:

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 

Así que ahora escribo

EXEC dbo.DropView 'mySchema', 'myView' 
GO 
CREATE View myView 
... 
GO 

Creo que hace mis changescripts son un poco más legibles

4

A partir de SQL Server 2016 que tienen

DROP TABLE IF EXISTS [foo]; 

MSDN source

14

Para tener una referencia de SQL Server 2016 SP1+ podría utilizar CREATE OR ALTER VIEW sintaxis.

MSDN CREATE VIEW:

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ]) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] 
[ ; ] 

OR ALTER

Condicionalmente altera la vista sólo si ya existe.

+0

Esa es una sintaxis. No puede usar palabras clave CREATE AND ALTER al mismo tiempo como lo hace en ORACLE. obtendrías los siguientes errores si se intenta así. - Sintaxis incorrecta cerca de la palabra clave 'OR'. - 'CREAR/ALTERAR PROCEDIMIENTO' debe ser la primera instrucción en un lote de consulta. –

+1

@DivTiwari, esto es aparentemente válido en SQL 2016. Solo tardó SQL Server 11 años en ponerse al día con esta función de oráculo, al parecer :) – JosephStyons

+1

@JosephStyons ¡De hecho, tiene razón! No entiendo cómo perdieron una característica tan importante por tanto tiempo. –

Cuestiones relacionadas