Görünüm tanımını düz ADO kullanarak SQL Server'dan almanın bir yolu var mı?


92

OpenSchema()Farklı enkarnasyonlarında ADO Connection çağrısını kullanarak bir SQL sunucusunda barındırılan veritabanlarından sütun tanımlarını başarıyla çıkarıyorum, böylece bu tabloları başka bir SQL veritabanında programlı olarak yeniden oluşturabilirim. Çok uzak çok iyi.

Yukarıdaki tablolarla ana etkileşim, birden çok görünüm kullanılarak gerçekleşir; ederken OpenSchema()bir tablo için sütun tanımlarını döndüren aynı şekilde görünümü için sütun tanımlarını iade edebilir, bilgi Çünkü çok önemli bir kayıp olduğunu - görünümünde sütun eşleştiren altta yatan tablolarda hangi tablo ve sütun.

Görünümü ADOX Katalog Görünümlerini kullanarak oluşturmak için kullanılan SQL komutuna erişmeyi denedim, ancak kullandığımız SQL Server için OLEDB sürücüsünün bu işlevi desteklemediği anlaşılıyor.

ADO aracılığıyla görünüm yapılandırması için bu bilgilere "ColumnX, tablo Z'deki SütunY ile eşleşiyor" şeklinde veya görünümü oluşturmak için kullanılan gerçek SQL komutu şeklinde ulaşmanın bir yolu var mı?

Yanıtlar:


166

Hangi SQL Server sürümü?

SQL Server 2005 ve sonrası için, görünümü oluşturmak için kullanılan SQL komut dosyasını şu şekilde edinebilirsiniz:

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'

Bu, görünümü oluşturmak / değiştirmek için kullanılan komut dosyasını içeren tek bir satır döndürür.

Tablodaki diğer sütunlar, görünümün derlendiği sırada mevcut olan seçenekler hakkında bilgi verir.

Uyarılar

  • Görünüm son olarak ALTER VIEW ile değiştirilmişse, komut dosyası bir CREATE VIEW ifadesi yerine bir ALTER VIEW ifadesi olacaktır.

  • Komut dosyası, adı oluşturulduğu gibi yansıtır. Güncelleneceği tek zaman, ALTER VIEW çalıştırmanız veya CREATE VIEW ile görünümü bırakıp yeniden oluşturmanızdır. Görünüm yeniden adlandırılmışsa (örn. Aracılığıyla sp_rename) veya sahiplik farklı bir şemaya aktarılmışsa, geri aldığınız komut dosyası orijinal CREATE / ALTER VIEW ifadesini yansıtır: nesnelerin mevcut adını yansıtmaz.

  • Bazı araçlar çıktıyı keser. Örneğin, MS-SQL komut satırı aracı sqlcmd.exe, verileri 255 karakterde keser. Sonucu karakterlerle -y Nalmak için parametreyi geçebilirsiniz N.


8
Yanıttaki SQL sorgusu biraz basitleştirilebilir:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan

9
Başka bir uyarı, tanımı görüntüleyebilmek için muhtemelen doğru izinlere ihtiyacınız olmasıdır. Onlar için NULL alıyorum.
rveach

1
@schlamar, gördüğünüz tek şey ilk 255 karakter ise, sonuç sütununu yanlış dönüştürüyorsunuz. Şema sys.sql_modulessütunu şu şekilde tanımlar:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar, SSMS / Query Analyzer kullanıyorsanız, sorgu sonuçlarını metin olarak (ızgara yerine) çalıştırıyorsanız, [n][var]charverilerin varsayılan olarak 256 karakterle kesildiğini de not edebilirsiniz. Bunu Query..Query Options...& mdash; adresindeki menüden değiştirebilirsiniz . Ardından gelen kalıcı iletişim kutusundan, Results>Textsol taraftaki ağaç denetiminde düğüme gidin.
Nicholas Carey

1
MS-SQL komut satırı aracını (sqlcmd.exe) kullanıyorum. Verileri de keser. Daha fazla veri elde etmek için -y N parametresini geçmek zorunda kaldım (gerçekten MS?). Beni doğru yönü gösterdiğin için teşekkürler.
schlamar

24

Microsoft, bir Görünüm tanımını almak için aşağıdaki yöntemleri listeledi: 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';

12

SQL 2000 kullanıcıları için bu bilgiyi sağlayacak asıl komut şudur:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'

Bu sürüm Görünümü, her biri 4.000 karakterlik birden fazla kayda bölünmüş olarak döndürür. (SQL Server 2014 yılında test edilmiştir)
Ben

7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

2

Aşağıdaki sorgu üzerinden tablo / görünüm detaylarına ulaşabilirsiniz.

Tablo için: sp_help table_name Görünüm için: sp_help view_name


Yine de görünüm tanımını vermiyor.
Tobb

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

0

Bu örnek: Görünüm Koleksiyonu, CommandText Özellik Örneği (VB) GÖRÜNÜM ile ilgili KOMUTU değiştirerek GÖRÜNÜMLERİ korumak için ADOX'un nasıl kullanılacağını gösterir. Ama bunun yerine şu şekilde kullanmak:

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

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

sadece şu şekilde kullanmayı deneyin:

Set CommandText = cat.Views("AllCustomers").Command.CommandText
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.