[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.이보기를 감안할 때 :
이보기를 감안할 때 :
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.난 당신이하지 수 있다고 생각합니다.
난 당신이하지 수 있다고 생각합니다.
선택 쿼리 가죽이에 대해 수행 된 실제 데이터 소스. 당신은 아무것도, 즉보기, 테이블을 조회 할 수 있기 때문에 심지어 원격 서버를 연결.
-
==============================
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.아니 완벽한 솔루션; 하지만, 코드가 아니라 '로'로 일관 앨리어싱으로 구성되어 특히 높은 정확도로 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
이 도움이 나는 당신의 의견을 기대하고 희망
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
'SQL' 카테고리의 다른 글
[SQL] 액세스 2010 : 쿼리 식의 구문 오류 (누락 된 연산자) (0) | 2020.05.15 |
---|---|
[SQL] 점검 제한 조건 SQL 서버 2008 사용자 정의 기능 (0) | 2020.05.15 |
[SQL] MySQL의 : 내부 어디 대 가입 [중복] (0) | 2020.05.15 |
[SQL] SQL SELECT 첫 번째 N 양의 정수를 얻을 수 있습니다 (0) | 2020.05.15 |
[SQL] 이 두 합류 테이블 접근 방식의 차이? (0) | 2020.05.15 |