OracleのCREATE OR REPLACE VIEWと同等のSQL Server


115

Oracleでは、次に示すように、単一のステートメントでビューを再作成できます。

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

構文が示すように、これにより古いビューが削除され、指定した定義でビューが再作成されます。

同じことを行う同等のMSSQL(SQL Server 2005以降)はありますか?

回答:


103

上記の解決策は、ユーザーの権限を落とすリスクを負って仕事をします。以下のように、ビューまたはストアドプロシージャを作成または置換したいと思います。

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
私は「ドロップ」してから(再)「追加」する人でした。しかし今、私はこのタイプの解決策に頼っています(そこにない場合は追加してから変更します)。
granadaCoder

ビューを変更することは、ドロップして再作成するよりもはるかに優れています。ビューに既存のユーザーセキュリティ設定が多数ある場合、それらすべてを再作成する必要があります。これがこの問題に対する私のアプローチです。
ジョナス

あなたのCREATEとALTERは異なることをします...なぜですか?(一方は動的で、もう一方は動的ではなく、メッセージも異なります。)
Jay Sullivan

あなたのCREATE VIEWステートメントが "Alterステートメントで置き換えられた"とどのように関係しているのかわかりません。それはどういう意味ですか?また、ここで実際にどのコードを置き換える必要があるのか​​、またどのように行うのかも不明です。私は君の答えに戸惑う数少ない人の一人だろう。
KyleJulé2015年

2
SQL Server 2016 SP1 +については、lad2025の回答を参照してください。
MBWise

45

「IF EXISTS」を使用して、ビューが存在するかどうかを確認し、存在する場合はドロップできます。

存在する場合(SELECT_NAME from INFORMATION_SCHEMA.VIEWS
        WHERE TABLE_NAME = 'MyView')
    DROP VIEW MyView
行く

ビューの作成MyView
なので 
     ....
行く

13
この問題は、ドロップされたオブジェクトに存在していた可能性のある権限をすべて失うことです。
サイモン、2011

37

参考として、構文を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 ]   
[ ; ]

または変更

すでに存在する場合にのみ、条件付きでビューを変更します。

db <> fiddleデモ


それは構文です。ORACLEの場合のように、CREATEキーワードとALTERキーワードの両方を同時に使用することはできません。このようにしようとすると、以下のエラーが発生します。-キーワード「OR」付近の構文が正しくありません。-'CREATE / ALTER PROCEDURE'はクエリバッチの最初のステートメントである必要があります。
ティヴァリダイワリ

3
@DivTiwari、これは明らかにSQL 2016で有効です。SQLサーバーがこのオラクル機能に追いつくのに11年しかかかりませんでした:)
JosephStyons

1
@JosephStyons確かに、あなたは正しいです!彼らがこのような重要な機能をどのようにして長い間見逃していたのか理解できません。
divティワリ2017年

@DivTiwariそれは開発者の選択 でした:作成するか変更するか遅くなることはありません:)
Lukasz Szozda

14

私が使う:

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

私の変更スクリプトがもう少し読みやすくなると思います


7

私は通常、次のようなものを使用します。

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


3

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-


ありがとう、これは素晴らしいです。私はそれがSQL 2005での双方向戻っていた、私は質問を書いたとき、この構文はSQL 2016で導入されたことを確認
JosephStyons

2

ALTERを使用してビューを更新できますが、ビューがすでに存在する場合にのみ機能するため、これはOracleコマンドとは異なります。常に機能するので、DaveKの回答をお勧めします。


1
ただし、ALTERは既存の権限を保持します(新しいバージョンに構文エラーがある場合は古いバージョンを保持します)。したがって、IF NOT EXISTS ...を使用してスタブを作成してから、ALTERを使用してスタブまたはオリジナルを置き換えると、権限と依存関係を維持するのに優れている場合があります。
クリステン

1

SQL Server 2016(またはそれ以降)では、これを使用できます。

CREATE OR ALTER VIEW VW_NAMEOFVIEW AS ...

古いバージョンのSQLサーバーでは、次のようなものを使用する必要があります

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

または、ビューに依存関係がない場合は、ビューを削除して再作成するだけです。

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 ...

1
SQL Server 2016以降を使用していCREATE OR REPLACE VIEWますが、構文を使用できません。正しい構文はCREATE OR ALTER VIEWです。どのようにeverybdody状態それがあることを、来るCREATE OR REPLACE🤔私が見つける他のすべてのSOのスレッドで
WoIIe

@ Wolle、CREATE OR REPLACEはOracleの構文です(質問を参照)
Eugene Lycenok
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.