Створити Перегляд у визначеній базі даних з динамічним 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 після використання оператора.

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

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

Тільки щоб ви знали, GO GO не працює у виконанні
Кінг Чан

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