복붙노트

[SQL] 뷰에서 사용되는 별명의 실제 열 이름을 찾기?

SQL

뷰에서 사용되는 별명의 실제 열 이름을 찾기?

내가 열 이름 중 일부는 별명이 예에서는 "성"처럼되는 뷰가 있다고 가정 :

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'

수율 :

 ----------------
|ALIAS     |TYPE |
 ----------------
|firstName |nchar|
|middleName|nchar|
|surName   |nchar|
 ----------------

그러나, 나는뿐만 아니라 실제 열 이름을 알고 싶습니다. 이상적 :

 ---------------------------
|ALIAS     |TYPE |REALNAME  |
 ---------------------------
|firstName |nchar|firstName |
|middleName|nchar|middleName|
|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'

이 수율 :

 ---------------------------
|ALIAS     |TYPE |REALNAME  |
 ---------------------------
|firstName |nchar|firstName |
|middleName|nchar|middleName|
|surName   |nchar|code      |
|surName   |nchar|lastName  |
 ---------------------------

하지만 세 번째 기록은 잘못이다 -이 같은 "COLUMN_ID"두 개의 열이 있기 때문에,에 "가입하기"절을 사용하여 만든보기로 발생하지만, 다른 테이블에.

해결법

  1. ==============================

    1.이보기를 감안할 때 :

    이보기를 감안할 때 :

    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'
    

    이는 SQL 서버 2005 +입니다. 여기 참조를 참조하십시오

    편집하다

    동일한보기를 제공합니다. 이 쿼리 검색 :

    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
    

    이것은 또한 SQL에서 테스트되어 2005 +

  2. ==============================

    2.난 당신이하지 수 있다고 생각합니다.

    난 당신이하지 수 있다고 생각합니다.

    선택 쿼리 가죽이에 대해 수행 된 실제 데이터 소스. 당신은 아무것도, 즉보기, 테이블을 조회 할 수 있기 때문에 심지어 원격 서버를 연결.

  3. ==============================

    3.이에 대한 답을 찾기 위해 노력하고, 반복 작업과 결국 포기 나타났다 포스터를하지 않았다 솔루션에 실행 시간의 숫자를 소비하는 데, 나는 결국 여기에 대한 답변을 우연히 발견 그 일에 나타납니다 :

    이에 대한 답을 찾기 위해 노력하고, 반복 작업과 결국 포기 나타났다 포스터를하지 않았다 솔루션에 실행 시간의 숫자를 소비하는 데, 나는 결국 여기에 대한 답변을 우연히 발견 그 일에 나타납니다 :

    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 기능에 대한 문서는 SQL 서버 2012 이후 사용할 수, 여기에서 찾을 수 있습니다 :

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

    링크 포스터에 대한 모든 신용, 나는 나 자신이 밖으로 작동하지 않았다, 그러나 나는 내가 연결 한 것보다 훨씬 더 쉽게이 스레드를 발견로이 정보를 다른 사람 검색에 유용 경우 여기를 게시하고 싶었다 .

  4. ==============================

    4.아니 완벽한 솔루션; 하지만, 코드가 아니라 '로'로 일관 앨리어싱으로 구성되어 특히 높은 정확도로 view_definition을 구문 분석 할 수 있습니다. 또한, 하나는 별칭 후 쉼표 ','에 대한 구문 분석 할 수 있습니다.

    아니 완벽한 솔루션; 하지만, 코드가 아니라 '로'로 일관 앨리어싱으로 구성되어 특히 높은 정확도로 view_definition을 구문 분석 할 수 있습니다. 또한, 하나는 별칭 후 쉼표 ','에 대한 구문 분석 할 수 있습니다.

    참고로 : 선택 조항의 마지막 필드는 쉼표가되지 않습니다 내가 주석으로 사용되는 항목을 제외 할 수 없습니다 (예를 들어로보기 텍스트에 인터레이스 -)

    나는 대응 'vMy_Table'라는 'MY_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 
    

    이 도움이 나는 당신의 의견을 기대하고 희망

  5. from https://stackoverflow.com/questions/10048056/find-the-real-column-name-of-an-alias-used-in-a-view by cc-by-sa and MIT license