SQL Server equivalent to Oracle's CREATE OR REPLACE VIEW

后端 未结 9 1738
猫巷女王i
猫巷女王i 2020-12-02 10:24

In Oracle, I can re-create a view with a single statement, as shown here:

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


        
相关标签:
9条回答
  • 2020-12-02 10:44

    I use:

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

    ...

    Recently I added some utility procedures for this kind of stuff:

    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
    

    So now I write

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

    I think it makes my changescripts a bit more readable

    0 讨论(0)
  • 2020-12-02 10:46

    It works fine for me on 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-

    0 讨论(0)
  • 2020-12-02 10:49

    You can use 'IF EXISTS' to check if the view exists and drop if it does.

    IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
            WHERE TABLE_NAME = 'MyView')
        DROP VIEW MyView
    GO
    
    CREATE VIEW MyView
    AS 
         ....
    GO
    
    0 讨论(0)
  • 2020-12-02 10:51

    In SQL Server 2016 (or newer) you can use this:

    CREATE OR ALTER VIEW VW_NAMEOFVIEW AS ...
    

    In older versions of SQL server you have to use something like

    DECLARE @script NVARCHAR(MAX) = N'VIEW [dbo].[VW_NAMEOFVIEW] AS ...';
    
    IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
    -- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
    BEGIN EXEC('CREATE ' + @script) END
    ELSE
    BEGIN EXEC('ALTER ' + @script) END
    

    Or, if there are no dependencies on the view, you can just drop it and recreate:

    IF EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
    -- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
    BEGIN 
       DROP VIEW [VW_NAMEOFVIEW];
    END
    
    CREATE VIEW [VW_NAMEOFVIEW] AS ...
    
    0 讨论(0)
  • 2020-12-02 11:01

    I typically use something like this:

    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 讨论(0)
  • 2020-12-02 11:02

    As of SQL Server 2016 you have

    DROP TABLE IF EXISTS [foo];
    

    MSDN source

    0 讨论(0)
提交回复
热议问题