web-dev-qa-db-ja.com

SQL ServerでCREATE OR REPLACE VIEWを機能させるには?

CREATE OR REPLACE VIEWはSQL Serverで機能しないようです。では、CREATE OR REPLACE VIEWをSQL Serverで動作するように移植するにはどうすればよいですか?

これは私がやろうとしていることです:

CREATE OR REPLACE VIEW data_VVVV AS 
SELECT 
    VCV.xxxx,
        VCV.yyyy AS yyyy,
        VCV.zzzz AS zzzz
FROM 
TABLE_A
;

何か案は?

31
Alex

編集:この質問は重複としてマークされていますが、まだ注目を集めています。@ JaKXzによって提供される回答は正しく、受け入れられる回答である必要があります。


ビューの存在を確認する必要があります。次に、CREATE VIEW または ALTER VIEW結果に応じて。

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
14
Khan

@Khanの答えから借りて、私はそうするでしょう:

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

MSDNリファレンス

65
JaKXz

ビューの内容を複製する必要がない別の方法を次に示します。

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 ;

最初に、ビューの存在を確認します(これを行う他の方法があります)。存在しない場合は、単純で愚かなもので作成します。存在する場合は、alter viewステートメント。

40
Gordon Linoff

SQL Server 2016の回答

SQL Server 2016では、次のことができるようになりました( MSDN Source ):

DROP VIEW IF EXISTS dbo.MyView
24

受け入れられたソリューションには、同じステートメントを2回維持する必要があるという問題がありますが、効率的ではありません(動作しますが)。理論的には、Gordon Linoffのソリューションは外出先になりますが、ビューの作成はバッチの最初の行でなければならないため、MSSQLでは機能しません。

ドロップ/作成は、提示された質問に答えません。以下は、元の質問に従って仕事をします。

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')
8
statler

このようなものについては、コメントで説明してください:

--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];

乾杯-DJ

3
Dustin Jones

ビューを変更するには、ビューをドロップして再作成します。以下を使用して、ビューをドロップして再作成します。

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
0
Bright