13

この例の「surName」のように、列名の一部がエイリアスであるビューがあるとします。

CREATE VIEW myView AS
    SELECT  
            firstName,
            middleName,
            you.lastName surName
    FROM 
            myTable me
            LEFT OUTER JOIN yourTable you
            ON me.code = you.code
GO

INFORMATION_SCHEMAビューを使用して、ビューに関するいくつかの情報を取得できます。
たとえば、クエリ

SELECT column_name AS ALIAS, data_type AS TYPE
FROM information_schema.columns 
WHERE table_name = 'myView'

収量:

--------------------------------
|エイリアス|タイプ|
 --------------------------------
| firstName | nchar |
|ミドルネーム|nchar|
| surName | nchar |
 --------------------------------

ただし、実際の列名も知りたいのですが。理想的には:

---------------------------
|エイリアス|タイプ|本名|
 ---------------------------
| firstName | nchar | firstName |
|ミドルネーム|nchar|ミドルネーム|
| surName | nchar | lastName |
 ---------------------------

エイリアスに基づいて実際の列名を特定するにはどうすればよいですか? この情報を取得するには、sysテーブルやINFORMATION_SCHEMAビューを使用する方法が必要です。


編集: 私はこの忌まわしきに近づくことができます、それはアリオンの答えに似ています:

SELECT
    c.name AS ALIAS,
    ISNULL(type_name(c.system_type_id), t.name) AS DATA_TYPE,
    tablecols.name AS REALNAME
FROM 
    sys.views v
    JOIN sys.columns c ON c.object_id = v.object_id
    LEFT JOIN sys.types t ON c.user_type_id = t.user_type_id
    JOIN sys.sql_dependencies d ON d.object_id = v.object_id 
        AND c.column_id = d.referenced_minor_id
    JOIN sys.columns tablecols ON d.referenced_major_id = tablecols.object_id 
        AND tablecols.column_id = d.referenced_minor_id 
        AND tablecols.column_id = c.column_id
WHERE v.name ='myView'

これにより、次のようになります。

---------------------------
|エイリアス|タイプ|本名|
 ---------------------------
| firstName | nchar | firstName |
|ミドルネーム|nchar|ミドルネーム|
| surName |nchar|コード|
| surName | nchar | lastName |
 ---------------------------

ただし、3番目のレコードは間違っています。これは、「JOIN」句を使用して作成されたビューで発生します。これは、「column_id」が同じでテーブルが異なる2つの列があるためです。

4

4 に答える 4

11

この見方を考えると:

CREATE VIEW viewTest
AS
SELECT
    books.id,
    books.author,
    Books.title AS Name
FROM
    Books

私が見ることができるのは、これを行うことで、使用される列と使用されるテーブルを取得できることです。

SELECT * 
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE AS UsedColumns 
WHERE UsedColumns.VIEW_NAME='viewTest'

SELECT * 
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE AS UsedTables 
WHERE UsedTables.VIEW_NAME='viewTest'

これはSQLServer2005以降用です。こちらのリファレンスを参照してください

編集

同じ見方をしてください。このクエリを試してください:

SELECT
    c.name AS columnName,
    columnTypes.name as dataType,
    aliases.name as alias
FROM 
sys.views v 
JOIN sys.sql_dependencies d 
    ON d.object_id = v.object_id
JOIN .sys.objects t 
    ON t.object_id = d.referenced_major_id
JOIN sys.columns c 
    ON c.object_id = d.referenced_major_id 
JOIN sys.types AS columnTypes 
    ON c.user_type_id=columnTypes.user_type_id
    AND c.column_id = d.referenced_minor_id
JOIN sys.columns AS aliases
    on c.column_id=aliases.column_id
    AND aliases.object_id = object_id('viewTest')
WHERE
    v.name = 'viewTest';

それは私のためにこれを返します:

columnName  dataType  alias

id          int       id
author      varchar   author
title       varchar   Name

これはSQL2005+でもテストされています

于 2012-04-07T12:26:53.723 に答える
5

できないと思います。

SELECTクエリは、実行された実際のデータソースを非表示にします。ビュー、テーブル、リンクされたリモートサーバーなど、何でもクエリできるためです。

于 2012-04-06T19:12:23.937 に答える
5

これに対する答えを見つけるために何時間も費やし、うまくいかなかった解決策と最終的にあきらめたように見えるポスターに繰り返し遭遇した後、私は最終的にここでうまくいくように見える答えに出くわしました:

https://social.msdn.microsoft.com/Forums/windowsserver/en-US/afa2ed2b-62de-4a5e-ae70-942e75f887a1/find-out-original-columns-name-when-used-in-a-view- with-alias?forum = transactsql

次のSQLは、まさにあなたが探しているものを返します。それは確かに私が必要としていることを実行しており、パフォーマンスも良好であるように見えます。

SELECT  name
    , source_database
    , source_schema
    , source_table
    , source_column
    , system_type_name
    , is_identity_column
FROM    sys.dm_exec_describe_first_result_set (N'SELECT * from ViewName', null, 1) 

関数に関するドキュメントはsys.dm_exec_describe_first_result_setここにあり、SQLServer2012以降で利用できます。

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-describe-first-result-set-transact-sql

リンクのポスターのおかげで、私はこれを自分で解決しませんでしたが、リンク先のスレッドよりもはるかに簡単にこのスレッドを見つけたので、この情報を検索する他の人に役立つ場合に備えて、ここに投稿したいと思いました。 。

于 2018-04-13T14:05:22.587 に答える
2

完璧な解決策ではありません。ただし、特にコードが「as」による一貫したエイリアシングで適切に編成されている場合は、view_definitionを高精度で解析することができます。さらに、エイリアスの後にコンマ「、」を解析できます。

注意:select句の最後のフィールドにはコンマがなく、コメントとして使用されているアイテムを除外できませんでした(たとえば、ビューテキストで-とインターレースされています)

'My_Table'という名前のテーブルと、それに対応して'vMy_Table'という名前のビューについて以下を記述しました。

select alias, t.COLUMN_name
from 
(
select VC.COLUMN_NAME, 



case when
ROW_NUMBER () OVER (
partition by C.COLUMN_NAME order by 
CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION))- 
CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION)

) = 1

then 1
else 0 end
as lenDiff



,C.COLUMN_NAME as alias

 ,CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION)) diff1
 , CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION) diff2

 from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE VC
inner join INFORMATION_SCHEMA.VIEWS V on V.TABLE_NAME = 'v'+VC.TABLE_Name
inner join information_schema.COLUMNS C on C.TABLE_NAME = 'v'+VC.TABLE_Name
where VC.TABLE_NAME = 'My_Table'
and CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION))- 
CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION) >0
)
t

where lenDiff = 1 

これがお役に立てば幸いです。フィードバックをお待ちしております。

于 2014-10-01T04:13:21.567 に答える