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