sql >> データベース >  >> RDS >> Sqlserver

テーブル変数から列の明確な名前を取得する

    テーブル変数 top(0) をクエリできます outer applyfor xml path('') を使用して 1 行から 次に、要素名の 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)
    

    もう 1 つのオプションは、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);
    

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

    <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>
    


    1. PHP/OCIで最後に挿入されたROWIDを取得する

    2. MySQLレプリケーション速度

    3. MySQLでutf8の壊れた文字を検出する

    4. データベーススキーマを視覚化するための優れたツールですか?