Apakah ada cara untuk mengambil definisi tampilan dari SQL Server menggunakan ADO biasa?

92

Saya berhasil mengekstrak definisi kolom dari database yang dihosting di server SQL menggunakan OpenSchema()panggilan ADO Connection dalam berbagai inkarnasinya sehingga saya dapat membuat ulang tabel tersebut secara terprogram di database SQL lain. Sejauh ini bagus.

Interaksi utama dengan tabel di atas terjadi menggunakan beberapa tampilan; sementara OpenSchema()dapat mengembalikan definisi kolom untuk tampilan dengan cara yang sama seperti mengembalikan definisi kolom untuk tabel, ada sedikit informasi penting yang hilang - tabel dan kolom mana di tabel yang mendasari kolom dalam tampilan peta.

Saya mencoba mengakses perintah SQL yang digunakan untuk membuat tampilan menggunakan Tampilan Katalog ADOX, tetapi tampaknya driver OLEDB untuk SQL Server yang kami gunakan tidak mendukung fungsi ini.

Apakah ada cara untuk mendapatkan informasi ini untuk konfigurasi tampilan melalui ADO, baik dengan cara yang menyatakan "ColumnX memetakan ke KolomY di tabel Z" atau dalam bentuk perintah SQL sebenarnya yang digunakan untuk membuat tampilan?

Timo Geusch
sumber

Jawaban:

166

Versi SQL Server yang mana?

Untuk SQL Server 2005 dan yang lebih baru, Anda bisa mendapatkan skrip SQL yang digunakan untuk membuat tampilan seperti ini:

select definition
from sys.objects     o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.MyView')
  and o.type      = 'V'

Ini mengembalikan satu baris yang berisi skrip yang digunakan untuk membuat / mengubah tampilan.

Kolom lain dalam tabel menceritakan tentang opsi yang ada pada saat tampilan dikompilasi.

Peringatan

  • Jika tampilan terakhir diubah dengan ALTER VIEW, skrip akan menjadi pernyataan ALTER VIEW, bukan pernyataan CREATE VIEW.

  • Naskah tersebut mencerminkan nama saat dibuat. Satu-satunya waktu itu diperbarui adalah jika Anda menjalankan ALTER VIEW, atau menjatuhkan dan membuat ulang tampilan dengan CREATE VIEW. Jika tampilan telah diubah namanya (misalnya, melalui sp_rename) atau kepemilikan telah ditransfer ke skema yang berbeda, skrip yang Anda dapatkan kembali akan mencerminkan pernyataan CREATE / ALTER VIEW asli: itu tidak akan mencerminkan nama objek saat ini.

  • Beberapa alat memotong keluaran. Misalnya, alat baris perintah MS-SQL sqlcmd.exe memotong data menjadi 255 karakter. Anda bisa melewatkan parameter -y Nuntuk mendapatkan hasil dengan Nkarakter.

Nicholas Carey
sumber
8
Permintaan SQL dari jawabannya dapat disederhanakan sedikit:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan
9
peringatan lain adalah Anda mungkin memerlukan izin yang tepat untuk dapat melihat definisi tersebut. Saya mendapatkan NULL untuk mereka.
rveach
1
@schlamar, jika yang Anda lihat hanyalah 255 karakter pertama, Anda salah mengonversi kolom hasil. Skema untuk sys.sql_modulesmendefinisikan kolom sebagai berikut:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey
1
@schlamar, Anda mungkin juga mencatat bahwa jika Anda menggunakan SSMS / Query Analyzer, jika Anda menjalankan hasil kueri sebagai teks (bukan kisi), secara default, [n][var]chardata dipotong menjadi 256 karakter. Anda dapat mengubahnya melalui menu di Query..Query Options...& mdash; Dari dialog modal berikutnya, telusuri ke Results>Textnode di kontrol pohon di sisi kiri.
Nicholas Carey
1
Saya menggunakan alat baris perintah MS-SQL (sqlcmd.exe). Ini juga memotong data. Saya harus melewati parameter -y N untuk mendapatkan lebih banyak data (benarkah MS?). Jadi terima kasih telah mengarahkan saya ke arah yang benar.
schlamar
24

Microsoft mencantumkan metode berikut ini untuk mendapatkan definisi Tampilan: http://technet.microsoft.com/en-us/library/ms175067.aspx


USE AdventureWorks2012;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.vEmployee'); 
GO

USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO

EXEC sp_helptext 'HumanResources.vEmployee';
DaveAlger
sumber
12

Untuk pengguna SQL 2000, perintah sebenarnya yang akan memberikan informasi ini adalah:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'
TravelinGuy
sumber
Versi ini mengembalikan Tampilan yang dipecah menjadi beberapa rekaman dengan masing-masing 4.000 karakter. (Diuji di SQL Server 2014.)
Ben
7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
sumber
3

Anda bisa mendapatkan detail tabel / tampilan melalui kueri di bawah ini.

Untuk tabel: sp_help nama_tabel Untuk Tampilan: sp_help view_name

vkstream
sumber
0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Bosco Han
sumber
0

Contoh ini: Kumpulan Tampilan, Contoh Properti CommandText (VB) Menunjukkan cara menggunakan ADOX untuk mempertahankan VIEWS dengan mengubah COMMAND yang terkait dengan VIEW. Tapi malah menggunakannya seperti ini:

 Set cmd = cat.Views("AllCustomers").Command  

' Update the CommandText of the command.  
cmd.CommandText = _  
"Select CustomerId, CompanyName, ContactName From Customers"  

coba saja pakai cara ini:

Set CommandText = cat.Views("AllCustomers").Command.CommandText
mLipok
sumber