10

私はSQLServerの初心者です。私はしばらくの間ウェブ上で探し回ろうとしましたが、私の質問に答えることができませんでした。誰かがSQLServer2008データベースに保存されているビューが正確にどこにあるか教えてもらえますか?

4

5 に答える 5

7

あなたの質問に対する衒学的な答えは...ビューのメタデータが物理的にどこに保存されているかを正確に知っているのはMicrosoftだけです。SQL 2000 から SQL 2005 (2008 のベース) への移行で、MS は、ビューが文字どおり格納されていたシステム テーブル (dbo.sysviews および dbo.syscomments) への直接アクセスを取り除き、抽象化のレイヤーを追加しました (これは、カタログ ビューを介してのみビューに関するメタ データにアクセスできることを意味します。INFORMATION_SCHEMA は、ANSI 準拠の一連のカタログ ビューです。バージョン間の相対的な移植性にはわずかに役立ちますが、多くの場合、SQL 2008 カタログ ビュー (この場合はsys.viewsおよびsys.sql_modules ) からより多くの情報を入手できます。

ビューの SQL 定義を含む sys.comments レコードを暗号化する ENCRYPTION オプション セットを使用してビューを作成できることに注意してください。ただし、暗号化されていない場合は、sp_helptext [MyView] で定義を簡単に確認できます。

以下の最初のコメントに従って編集し、「sys.comments」を「sys.sql_modules」に置き換えます

于 2013-02-07T10:41:41.170 に答える
4

:この投稿 http://improve.dk/archive/2012/08/27/where-does-sql-server-store-the-source-for-stored-procedures.aspxに基づいて、定義がのビューは、sys.sysobjvaluesシステム テーブルにも (また) 格納されます。

T-SQLすべてのユーザーモジュール (SQL Server 2008 内)のリストは、sys.sql_modulesシステム ビュー (リンク) を使用して照会できます。ここでは、ユーザー ビューの定義を確認できます (列 definition)。

SELECT  QUOTENAME(s.name)+'.'+QUOTENAME(o.name) AS full_object_name, 
        m.*
FROM    sys.sql_modules m
JOIN    sys.objects o ON m.object_id=o.object_id
JOIN    sys.schemas s ON o.schema_id=s.schema_id
WHERE   o.type='V' -- only view objects
ORDER BY full_object_name

実行EXEC sp_helptext 'sys.sql_modules'すると、このシステム ビューのソース コードが得られます。

CREATE VIEW sys.sql_modules AS
    SELECT object_id = o.id,
        definition = object_definition(o.id),
        uses_ansi_nulls = sysconv(bit, o.status & 0x40000),             -- OBJMOD_ANSINULLS
        uses_quoted_identifier = sysconv(bit, o.status & 0x80000),      -- OBJMOD_QUOTEDIDENT
        is_schema_bound = sysconv(bit, o.status & 0x20000),             -- OBJMOD_SCHEMABOUND
        uses_database_collation = sysconv(bit, o.status & 0x100000),    -- OBJMOD_USESDBCOLL
        is_recompiled = sysconv(bit, o.status & 0x400000),              -- OBJMOD_NOCACHE
        null_on_null_input = sysconv(bit, o.status & 0x200000),         -- OBJMOD_NULLONNULL
        execute_as_principal_id = x.indepid
    FROM sys.sysschobjs o
    LEFT JOIN sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNER
    WHERE o.pclass <> 100
        AND ((o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1)
            OR (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1)
            OR (type IN ('R','D') AND o.pid = 0))

このビューsys.sysschobjs は、ビューの定義を格納するために使用されるシステム テーブルであると思われる別のシステム オブジェクトを照会していることがわかります。

注1:ビューの定義を見つけるために使用することは、列の定義が(最大4000文字)でINFORMATION_SCHEMA.VIEWSあるため、信頼できる方法ではありません。INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITIONconvert(nvarchar(4000), object_definition(object_id))

注 2: 代わりに、sys.sql_modules.definitioncolumn:を使用する必要がありますdefinition = object_definition(o.id)object_definition関数 (リンク) を見ると、戻り値の型が であることがわかりますnvarchar(max)

于 2013-02-07T10:31:57.920 に答える
2

システムテーブル内。

次のクエリはそれらを取得します...

SELECT TABLE_NAME as ViewName、VIEW_DEFINITION as ViewDefinition FROM INFORMATION_SCHEMA.Views

それらを通常表示編集するには、スタジオマネージャーのテーブルの下にあるビューフォルダーを確認します。

デザイナを使用してこのフォルダから作成/編集するか、スクリプトを作成できます。

于 2013-02-07T09:39:57.283 に答える
2

ビューが生成するテーブルを意味する場合、答えはそれらがまったく保存されていないということです。ビューは単なるクエリであり、保存されるのはそれだけです。ビューをクエリすると、dbエンジンはビュークエリの結果を取得してからそれらをクエリします。

DBエンジンは「マテリアライズド」ビューを格納できますが、それは別のトピックです。

于 2013-02-07T09:40:04.580 に答える
1

ビューは、データベース スキーマ (INFORMATION_SCHEMA.Views) に格納される単純な SQL ステートメントです。したがって、ビューを呼び出すたびに、SQL ステートメントが実行され、メインの物理テーブルから行が返されます。

定義 (SQL ステートメント) を格納するが結果を格納しない論理テーブルとしてビューを指定することもできます。

上記のダンが言ったように、以下のステートメントを使用して定義を確認できます。ビュー定義が暗号化されていない場合のみ: SELECT TABLE_NAME as ViewName, VIEW_DEFINITION as ViewDefinition FROM INFORMATION_SCHEMA.Views

詳細については、View @ MSDNを参照してください。

于 2013-02-07T10:13:57.783 に答える