2017-03-29 7 views
0

매우 정직한 인덱싱 된 뷰를 스크립팅하려고하지만 SQL은 단순히 내 노력을 거부합니다. 문제를 조사해 보았지만 행운이 없었습니다. 불행히도 SQL 전문가가 아니기 때문에 누락 된 것이 있는지 간단하지 않습니다. 이 스크립트의 템플릿은 DBA에 의해 나에게 건네지 만, 그는 내가하는 것 이상을 모른다. 여기에 첫 번째 오류가 나타납니다 스크립트의 상단입니다 :스키마 바인딩을 사용하여 인덱싱 된 뷰를 만들 수 없습니다.

--Set the options to support indexed views. 
SET NUMERIC_ROUNDABORT OFF; 
GO 
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, 
    QUOTED_IDENTIFIER, ANSI_NULLS ON; 
GO 
--Create view with schemabinding. 
IF OBJECT_ID ('[dbo].[APIMenus]', 'view') IS NOT NULL 
    DROP VIEW [dbo].[APIMenus] ; 
GO 
BEGIN 
    CREATE VIEW [dbo].[APIMenus] 
    WITH SCHEMABINDING 
    AS 
     SELECT 
      [t0].[GroupName] AS [defaultValue], 
      [t1].[GroupName] AS [transValue],..... 

오류가 "CREATE VIEW must be the only statement in the batch"하지만 내가 전에 문제를 해결해야 후 적절한 GO 문으로 BEGIN...END에 포장, 이해, 아직 것과 그것을 계속됩니다. 아무도 내가 잘못하고있는 것을 발견 할 수 있습니까?

답변

1

오류는 정확합니다. CREATE VIEWBEGIN/END에두면이 메시지가 표시되지 않습니다. BEGIN/END을 완전히 제거하면 뷰가 정의 된 후 일괄 처리가 CREATE VIEW으로 시작하고 GO으로 끝나면 오류가 사라지고 CREATE 구조 앞에이 DROP을 계속 사용할 수 있습니다. 이 후자의 기술

if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL 
    exec ('create view cars as select 1') 
go 
alter view cars as 
    select * from vans where type==1 
GO 

:

if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL 
    exec ('create view cars as select * from vans where type=1') 
go 

때때로 나는이를 보았다 :

이미 존재하는 뷰를 작성하지 않는이 문제를 처리하는 약간 다른 방법은 동적 SQL을 호출하는 것입니다 복잡한 SQL이 문자열에 포함되지 않는다는 장점이 있으며 형식을 멋지게 지정할 수 있습니다.