Buat Lihat dalam database yang ditentukan dengan sql dinamis?

16

Saya sedang menulis sql dinamis untuk menjatuhkan dan membuat tampilan dalam database yang berbeda.

Jadi saya menulis:

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

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

Ini memberi saya kesalahan:

'CREATE VIEW' harus menjadi pernyataan pertama dalam kumpulan permintaan.

Jika saya menghapus pernyataan DATABASE USE berfungsi dengan baik, tetapi kemudian basis data tidak menentukan lagi ....

Bagaimana saya bisa menyelesaikan masalah ini?

Raja Chan
sumber

Jawaban:

25

Anda dapat menggunakan EXECpanggilan bersarang . Konteks database diubah oleh USEtetap ke batch anak.

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)
Martin Smith
sumber
1
+1 - Jika Anda skrip tampilan menggunakan SMO ini adalah bagaimana kerangka kerja melakukannya juga - definisi dieksekusi dalam SQL dinamis untuk mengatasi batasan
JNK
1
@ KingChan - Anda dapat memilih dan menerima, FYI;)
JNK
@JNK +1 tentu saja ~ :)
King Chan
pasti berhasil !! Meskipun saya menggunakannya, dengan banyak variabel di dalam query bersarang jadi saya sakit kepala karena penanganan penawaran! solusi hebat sekalipun!
Anda adalah seorang pahlawan. Akan menamai anak sulung saya setelah Anda.
Jens
-1

Salah satu cara yang saya tangani ketika mengalami kasus ini adalah menempatkan GO setelah menggunakan pernyataan.

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

  SELECT ........something'
exec (@CreateViewStatement)
sgojgini
sumber
Asal tahu saja, statment GO tidak akan berjalan di eksekutif
King Chan
2
Ini tidak akan berfungsi dalam konteks SQL dinamis. GOadalah pembatas batch dalam alat klien bukan kata kunci TSQL.
Martin Smith