동적 SQL을 사용하여 지정된 데이터베이스에서 View를 작성 하시겠습니까?


16

다른 데이터베이스에서 뷰를 삭제하고 작성하기 위해 동적 SQL을 작성하고 있습니다.

그래서 나는 썼다 :

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

그것은 나에게 오류를 준다 :

'CREATE VIEW'는 쿼리 일괄 처리에서 첫 번째 문이어야합니다.

USE DATABASE 문을 제거하면 정상적으로 작동하지만 데이터베이스가 더 이상 지정되지 않습니다.

이 문제를 어떻게 해결할 수 있습니까?

답변:


25

중첩 된 EXEC통화 를 사용할 수 있습니다 . USE지속에 의해 변경된 데이터베이스 컨텍스트 는 하위 배치로 지속됩니다.

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1-SMO를 사용하여 뷰를 스크립팅하는 경우 프레임 워크가 수행하는 방식입니다. 정의가 동적 SQL에서 실행되어 제한을 극복합니다.
— JNK

1
@KingChan-당신은 공감하고 받아 들일 수 있습니다, FYI;)
— JNK

@JNK +1 물론 ~ :)
— King Chan

확실히 일했다!! 비록 그것을 사용했지만 중첩 된 쿼리 안에 많은 변수가있어서 따옴표 처리의 골치 아픈 사람이었습니다! 그래도 훌륭한 솔루션!

당신은 영웅입니다. 당신의 이름을 따서 first 아를 지을 것입니다
— Jens

-1

이 경우에 처리 할 수있는 한 가지 방법은 use after 문을 배치하는 것입니다.

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

아시다시피, GO 통계는 exec에서 실행되지 않습니다
— King Chan

2
동적 SQL 컨텍스트에서는 작동하지 않습니다. GOTSQL 키워드가 아닌 클라이언트 도구의 배치 구분 기호입니다.
— Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.