プレーンADOを使用してSQLServerからビュー定義を取得する方法はありますか?


89

OpenSchema()さまざまなインカネーションでADOConnection呼び出しを使用して、SQLサーバーでホストされているデータベースから列定義を正常に抽出しているので、それらのテーブルを別のSQLデータベースにプログラムで再作成できます。ここまでは順調ですね。

上記のテーブルとの主な相互作用は、複数のビューを使用して行われます。一方でOpenSchema()、それは表の列定義を返すのと同じ方法でビューの列定義を返すことができる、情報の重要なビットが欠落している-ビュー内の列がマップ基本となるテーブルのどのテーブルと列。

ADOXカタログビューを使用してビューを作成するために使用されるSQLコマンドにアクセスしようとしましたが、使用しているSQLServerのOLEDBドライバーがこの機能をサポートしていないようです。

「ColumnXはテーブルZのColumnYにマップされます」という方法で、またはビューの作成に使用される実際のSQLコマンドの形式で、ADOを介してビュー構成のこの情報を取得する方法はありますか?

回答:


159

どのバージョンのSQLServerですか?

SQL Server 2005以降の場合、次のようなビューの作成に使用されるSQLスクリプトを取得できます。

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'

これは、ビューの作成/変更に使用されるスクリプトを含む単一の行を返します。

表の他の列は、ビューがコンパイルされたときに配置されていたオプションについて説明しています。

警告

  • ビューがALTERVIEWで最後に変更された場合、スクリプトはCREATEVIEWステートメントではなくALTERVIEWステートメントになります。

  • スクリプトは、作成された名前を反映しています。更新されるのは、ALTER VIEWを実行するか、CREATEVIEWを使用してビューを削除して再作成する場合のみです。ビューの名前が変更された場合(たとえば、via sp_rename)、または所有権が別のスキーマに移された場合、返されるスクリプトは元のCREATE / ALTERVIEWステートメントを反映します。オブジェクトの現在の名前は反映されません。

  • 一部のツールは出力を切り捨てます。たとえば、MS-SQLコマンドラインツールsqlcmd.exeは、255文字でデータを切り捨てます。パラメータ-y Nを渡して、Ncharsで結果を取得できます。


8
答えからSQLクエリは少し単純化することができます:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
イワン

9
もう1つの注意点は、定義を表示するには、おそらく適切な権限が必要なことです。私は彼らのためにNULLを取得しています。
rveach 2015年

1
@schlamar、表示されているのが最初の255文字だけの場合は、結果列が正しく変換されていません。スキーマsys.sql_modulesこうして定義カラム:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
ニコラス・キャリー

1
@ schlamar、SSMS / Query Analyzerを使用している場合、クエリ結果を(グリッドではなく)テキストとして実行している場合、デフォルトで[n][var]charは、データは256文字で切り捨てられることに注意してください。Query..Query Options...—のメニューから変更できます。続くモーダルダイアログから、Results>Text左側のツリーコントロールのノードにドリルダウンします。
ニコラスキャリー2015年

1
MS-SQLコマンドラインツール(sqlcmd.exe)を使用しています。データも切り捨てられます。より多くのデータを取得するには、パラメーター-y Nを渡す必要がありました(本当にMS?)。だから私を正しい方向に向けてくれてありがとう。
schlamar 2015年

24

Microsoftは、ビュー定義を取得するための次の方法をリストしました: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のユーザーの場合、この情報を提供する実際のコマンドは次のとおりです。

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

このバージョンは、それぞれ4,000文字の複数のレコードに分割されたビューを返します。(SQL Server 2014でテスト済み。)
Ben


3

以下のクエリでテーブル/ビューの詳細を取得できます。

テーブルの場合:sp_help table_name ビューの場合:sp_help view_name


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.