Dinamik sql ile belirtilen veritabanında Görünüm oluştur?


16

Bırakıp farklı veritabanında görünüm oluşturmak için dinamik bir sql yazıyorum.

Ben de yazdım:

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

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

Bana hata veriyor:

'CREATE VIEW' bir sorgu grubundaki ilk ifade olmalıdır.

Eğer KULLANIM VERİTABANI deyimini kaldırırsanız iyi çalışır, ancak veritabanı artık belirtmez ....

Bu sorunu nasıl çözebilirim?

Yanıtlar:


25

Yuvalanmış EXECçağrıları kullanabilirsiniz . Veritabanı bağlamı USEkalıcı olarak alt kümeye değişti .

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 kullanarak görünümleri komut dosyası yazarsanız, çerçeve de bunu yapar - kısıtlamaları
aşmak

1
@KingChan - hem oy verip kabul edebilirsin, FYI;)
JNK

@JNK +1 tabii ki ~ :)
King Chan

kesinlikle çalıştı !! Her ne kadar ben kullanılmış olsa da, ben teklif işleme bir baş ağrısı olduğunu bu yüzden iç içe sorgu içinde birçok değişken wih! harika bir çözüm olsa!

Sen bir kahramansın. İlk doğan çocuğumu senden sonra adlandıracağım.
Jens

-1

Bu durumda çalıştırıldığında ele aldığım yollardan biri GO kullanım deyiminden sonra yerleştirmektir.

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

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

Bildiğiniz gibi, GO ifadesi exec'de çalışmaz
King Chan

2
Bu dinamik SQL bağlamında çalışmaz. GObir TSQL anahtar sözcüğü değil, istemci araçlarında bir toplu ayırıcıdır.
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.