1

私は次のようなテーブルを持っています

TABLEX-

+------+------------+
| NAME | TABLE_NAME |
+------+------------+
| X1   | X001       |
| X2   | X002       |
+------+------------+

このテーブルには、説明にすぎない name 列と、実際にはデータベースに既に存在するテーブルである table_name 列が含まれています。

X001テーブルには次のような列がありますX1_A, X1_B
X002テーブルには次のような列がありますX2_A, X2_B

ここで、列に存在する実際のテーブルのすべての列をTABLE_NAMEコンマ区切りの文字列で連結し、それを列として表示したいと考えています。

+------+------------+------------+
| NAME | TABLE_NAME |  COLUMNS   |
+------+------------+------------+
| X1   | X001       | X1_A, X1_B |
| X2   | X002       | X2_A, X2_B |
+------+------------+------------+

これは、CTE を使用して実現できます。STUFFwithを使用してクエリを正常に作成しましたXML PATHが、上記のテーブルには 200 の奇数行があり、リンクされた後続の各テーブルにはそれぞれ 100 の列があるため、パフォーマンスの問題が発生しています。

編集 -

SELECT 
P.NAME,
P.TABLE_NAME,
[COLUMNS]=(SELECT STUFF((SELECT ',' + NAME FROM sys.syscolumns WHERE ID = OBJECT_ID(P.TABLE_NAME) ORDER BY colorder FOR XML PATH('') ), 1, 1,''))
FROM TABLEX P 

TABLEX上記の表はどこにありますか。

4

1 に答える 1

2

これを試してみてください -

DDL:

IF OBJECT_ID (N'dbo.TABLEX') IS NOT NULL
   DROP TABLE TABLEX

IF OBJECT_ID (N'dbo.X001') IS NOT NULL
   DROP TABLE X001

IF OBJECT_ID (N'dbo.X002') IS NOT NULL
   DROP TABLE X002

CREATE TABLE dbo.TABLEX (NAME VARCHAR(50), TABLE_NAME VARCHAR(50))
INSERT INTO dbo.TABLEX (NAME, TABLE_NAME)
VALUES ('X1', 'X001'), ('X2', 'X002')

CREATE TABLE dbo.X001 (X1_A VARCHAR(50), X1_B VARCHAR(50))
CREATE TABLE dbo.X002 (X2_A VARCHAR(50), X2_B VARCHAR(50))

クエリ:

;WITH cte AS
(
     SELECT 
            NAME
          , TABLE_NAME
          , [COLUMN] = CAST('' AS VARCHAR(1024))
          , POS = 1
     FROM TABLEX t

     UNION ALL

     SELECT 
            t.NAME
          , t.TABLE_NAME
          , CAST([COLUMN] + ', ' + c.name AS VARCHAR(1024))
          , POS + 1
     FROM cte t
     JOIN sys.columns c ON 
                 OBJECT_ID('dbo.' + t.TABLE_NAME) = c.[object_id] 
               AND 
                 t.POS = c.column_id
)
SELECT 
       NAME
     , TABLE_NAME
     , [COLUMNS] = STUFF([COLUMN], 1, 2, '')
FROM (
     SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY POS DESC)
     FROM cte
) t
WHERE t.rn = 1

結果:

NAME   TABLE_NAME    COLUMNS
------ ------------- -------------
X1     X001          X1_A, X1_B
X2     X002          X2_A, X2_B

クエリ費用:

クエリ費用

統計:

    Query Presenter  Scans  Logical Reads
-------------------  -----  -------------
                XML      5              9
                CTE      3             48
于 2013-06-18T08:54:44.403 に答える