2013-01-16 1 views
4

변수 테이블에서 열에 대한 명확한 이름을 가져옵니다 : "# 468862B0"내가 같은 테이블 변수를 선언 할 수

select top 1 * from tempdb.sys.tables where type = 'U' order by create_date desc 
select TOP 1 name,* from tempdb.sys.sysobjects ORDER BY CRDATE desc 
:

DECLARE @tv_source TABLE(c1 int, 
providerName varchar(50), 
providerSMS varchar(50)) 

을 난 후 다음을 실행하면, 나는 유사한 테이블 이름을 참조

나는 즉시 실행하면 :

select TOP 3 * 
from tempdb.sys.columns 
where object_id in (select TOP 1 object_id from tempdb.sys.tables ORDER BY Create_date desc) 

는 내가 테이블 변수에 대한 위에서 언급 열을 참조하십시오.

내 질문에, "@tv_source"위의 테이블 선언에서 선언 한 이름과 해당 열을 명확하게 연결할 수있는 방법이 있습니까?

정상적인 테이블에서는 실제 이름이 표시되지만 위에서 언급 한 것처럼 테이블 변수는 16 진수 값으로 변합니다 (btw는 object_id의 16 진수 값입니다).

+0

동적 SQL이 허용됩니까? – PinnyM

+1

@HamletHakobyan 테이블 변수가 항상 tempdb에 생성됨 –

+0

@PinnyM 동적 SQL이 도움이 될 것이라고 생각하지 않지만 동적 SQL 자체의 텍스트가 아니라 데이터베이스의 정보를보고 싶습니다. 테이블의 범위를 명심하십시오 변수는 여기에 있습니다. 즉, 어떤 해결책을 볼 의향이 있습니다 :) –

답변

6

을 사용하여 한 행에서 outer apply으로 테이블 변수 top(0)을 쿼리 한 다음 XML에 쿼리하여 요소 이름을 쿼리 할 수 ​​있습니다.

열 이름에 잘못된 XML 요소 이름이없는 한 작동합니다. 열 이름은 예를 들어 앰퍼샌드 또는 공백을 사용할 수 없습니다.

declare @tv_source table 
(
    c1 int, 
    providerName varchar(50), 
    providerSMS varchar(50) 
) 

select TN.N.value('local-name(.)', 'sysname') as ColumnName 
from 
    (
    select TV.* 
    from (select 1) as D(N) 
    outer apply (
       select top(0) * 
       from @tv_source 
       ) as TV 
    for xml path(''), elements xsinil, type 
) as TX(X) 
cross apply TX.X.nodes('*') as TN(N) 

또 다른 옵션은 for xml autoxmlschema 지시어를 사용하는 것입니다. 이 솔루션은 잘못된 XML 문자를 처리하지만 이스케이프 처리되므로 [provider Name]과 같은 공백이있는 열 이름을 사용하는 경우 결과는 provider_x0020_Name이됩니다.
결과 XML을 변수에 저장하고 원하는 정보를 쿼리해야합니다.

declare @XML xml; 

set @XML = 
    (
    select top(0) * 
    from @tv_source 
    for xml auto, xmlschema, type 
); 

with xmlnamespaces('http://www.w3.org/2001/XMLSchema' as xsd) 
select T.X.value('@name', 'sysname') 
from @XML.nodes('//xsd:attribute') as T(X); 

XML에 의해 생성 된 xmlschema에는 더 많은 정보가 포함되어 있습니다. 테이블 변수 이름과 데이터 유형을 검색 할 수 있습니다.

<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet12" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet12" elementFormDefault="qualified"> 
    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" /> 
    <xsd:element name="_x0040_tv_source"> 
    <xsd:complexType> 
     <xsd:attribute name="c1" type="sqltypes:int" /> 
     <xsd:attribute name="providerName"> 
     <xsd:simpleType> 
      <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1035" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth"> 
      <xsd:maxLength value="50" /> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
     <xsd:attribute name="providerSMS"> 
     <xsd:simpleType> 
      <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1035" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth"> 
      <xsd:maxLength value="50" /> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
0

귀하의 의견을 통해이 연습은 학습을위한 것이며 특정 사용 사례 또는 필요가 없음을 확인했습니다. 즉, 테이블 변수 변수에서 자세한 열 메타 데이터를 얻는 또 다른 방법은 sp_describe_first_result_set을 사용하는 것입니다.

EXEC sp_describe_first_result_set @tsql = N' 
declare @tableName table (ID bigint, 
          Column1 bigint, 
          Column2 datetime, 
          createdBy nvarchar(100), 
          dateAdded nvarchar(12), 
          Type nvarchar(10) 
          ) 
SELECT * FROM @tableName;'; 
+0

이 링크에 응답 하시겠습니까? – Paparazzi