web-dev-qa-db-ja.com

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

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

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

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

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

79
Timo Geusch

SQL Serverのどのバージョンですか?

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'

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

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

警告

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

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

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

145
Nicholas Carey

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';
20
DaveAlger

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'
12
TravelinGuy
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
5
user1967725

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

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

1
vkstream