Создать таблицу, используя строки данных из столбца select - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно создать таблицу, используя строки другой таблицы в качестве имен столбцов. Причина в том, что моя база данных не реляционная, поэтому в каждом случае у меня есть таблица с данными, а другая - с соответствующими метаданными.

Пример:

Table 1:

Person
ID | Info
===================================================
1  | <John Smith><1st Avenue><Miami,Florida><33101>
2  | <Mary Walton><83th Street><New York, NY><1001>

Table 2: 

Person_Desc
Field   | Info
===================================================
ID      | Sequential identifier
Name    | Persons full name
Address | Physical location detail
City    | City
ZIP_C   | Postal office code

Я хотел бы создать хранимую процедуру, которая получит эти два имени таблицы в качестве параметра, и создаст третью таблицу, например так (потерпите меня и псевдокод, пожалуйста):

CREATE STORED PROCEDURE sp_relationalTable 
@dataTable nvarchar(50), 
@metadataTable nvarchar(50) , 
@TmpTable nvarchar(50)

    AS

    SELECT * FROM @metadataTable 

    CREATE TABLE @TmpData 
( @metadataTable_Field1 nvarchar(100), 
 ,@metadataTable_Field2 nvarchar(100),
 ,@metadataTable_Field3 nvarchar(100)....
)

    END

Это первая часть. Затем я запускаю оператор SELECT для Table1: Person, разбивая данные известным разделителем и INSERT все данные во вновь созданную таблицу.

INSERT INTO @TmpData (SELECT * FROM @dataTable)

В идеале, он может быть запущен на одном SP, как я говорил в начале, поэтому, когда вы запускаете такой SP, это будет выглядеть так:

EXEC sp_relationalTable Person, Person_Desc, RPerson

И я бы в итоге:

Table 3: 

RPerson
ID | Name        | Address       | City          | ZIP_C   |
============================================================
1  | John Smith  | 1st Avenue    | Miami,Florida |33101    |
2  | Mary Walton | 83th Street   | New York, NY  |1001     |

1 Ответ

0 голосов
/ 26 марта 2019

Может быть, это может помочь вам. измените код в соответствии с именами таблиц.

DECLARE @TABLE TABLE (
    ID INT IDENTITY(1, 1)
    ,Info VARCHAR(MAX)
    )

INSERT INTO @TABLE
VALUES ('<John Smith><1st Avenue><Miami,Florida><33101>')

INSERT INTO @TABLE
VALUES ('<Mary Walton><83th Street><New York, NY><1001>')

SELECT ID
    ,MAX(CASE 
            WHEN RNO = 1
                THEN INFO
            ELSE ''
            END) AS [PERSON]
    ,MAX(CASE 
            WHEN RNO = 2
                THEN INFO
            ELSE ''
            END) AS [Address]
    ,MAX(CASE 
            WHEN RNO = 3
                THEN INFO
            ELSE ''
            END) AS [City]
    ,MAX(CASE 
            WHEN RNO = 4
                THEN INFO
            ELSE ''
            END) AS [ZIP_C]
FROM (
    SELECT ID
        ,REPLACE(VALUE, '<', '') INFO
        ,ROW_NUMBER() OVER (
            PARTITION BY ID ORDER BY ID
            ) RNO
    FROM @TABLE
    CROSS APPLY string_split(Info, '>')
    WHERE VALUE <> ''
    ) A
GROUP BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...