Создать представление в указанной базе данных с динамическим SQL?


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 конечно ~ :)
Король Чан

определенно работал !! хотя я использовал это, со многими переменными внутри вложенного запроса, так что я был головной болью из-за обработки кавычек! отличное решение, хотя!

Вы герой. Назову моего первенца в честь тебя.
Йенс

-1

Один из способов, с которыми я справился, когда сталкиваюсь с этим делом, это поместить GO после оператора use.

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

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

Точно так же, вы знаете, что GO statment не будет работать в исполнении
King Chan

2
Это не будет работать в контексте динамического SQL. GOявляется разделителем пакетов в инструментах клиента, а не ключевым словом TSQL.
Мартин Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.