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

行を連結するときにFORXMLPATH('')がどのように機能するか

    FOR XML PATH('xxx') 各行を<xxx></xxx>に配置する結果セットのXML文字列を作成します 要素と、その列の名前を持つ要素内の行内の各列の値。

    PATHが空の場合(つまり、PATH('') )XML生成の行要素を省略します。列に名前がない場合は、XML生成の列要素が省略されます。両方のPATHが空で、列に名前がない場合、事実上、すべての行の文字列連結になります。

    次のステートメントを実行して、プロセスの洞察を深めます。

    -- Each row is in a <beta></beta> element
    -- Each column in that row in a <alfa></alfa> element (the column name)
    SELECT
        alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('beta');
    
    -- Since the PATH is empty, the rows are not put inside an element
    -- Each column in that row is in a <alfa></alfa> element (the column name)
    SELECT
        alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('');
    
    -- Since the PATH is empty, the rows are not put inside an element
    -- Since the column has no name it is not put inside an element     
    SELECT
        ','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('');
    
    -- This uses the STUFF function to remove the leading comma to get a proper comma-seperated list    
    SELECT STUFF((
        SELECT
            ','+TABLE_SCHEMA + '.' + TABLE_NAME
        FROM
            INFORMATION_SCHEMA.TABLES
        FOR
            XML PATH('')
        ),1,1,''
    ) AS comma_seperated_list;
    

    テーブルから列を選択するだけで、列名を削除するにはどうすればよいですか。私の好みの順に、いくつかの方法があります:

    • XQueryプロパティ:SELECT [text()]=column_name ...
    • サブクエリを使用して列の値を選択します:SELECT (SELECT column_name) ...
    • 列をそのタイプにキャストします:SELECT CAST(column_value AS <TYPE of the column>) ...

    例:

    SELECT
        [text()]=TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('');
    
    SELECT
        (SELECT TABLE_NAME)
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('');
    
    SELECT
        CAST(TABLE_NAME AS SYSNAME)
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('');
    



    1. SCUMMダッシュボードを使用したMySQLの効果的な監視:パート1

    2. MYSQLのより高いLIMITオフセットがクエリを遅くするのはなぜですか?

    3. Postgresドロップテーブルの構文エラー

    4. OracleSQLPIVOTテーブル