6

テーブル変数を次のように宣言できます。

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

次に次のように実行すると、「#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

その後すぐに実行すると:

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進値)に変換されます。

4

2 に答える 2

6

を使用して 1 つの行からテーブル変数top(0)をクエリし、次に要素名の XML をクエリできます。outer applyfor xml path('')

これは、無効な 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)

別のオプションは、のxmlschemaディレクティブを使用することですfor xml auto。このソリューションは無効な 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);

によって作成された XMLxmlschemaには、興味深い情報がさらに含まれています。テーブル変数名とデータ型も取得できます。

<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>
于 2013-01-17T06:36:53.503 に答える