Динамический SQL - Как использовать значение из результата в качестве имени столбца? - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над динамическим запросом SQL для хранимой процедуры MsSQL.

Существует таблица search.ProfileFields, которая содержит фактические имена столбцов в таблице, которую мне нужно запросить.

Моя цель состоит в том, чтобы SQL выбирал конкретный столбец в таблице, динамически из его родительского запроса.

Немного смущает, вот пример:

DECLARE @sql nvarchar(max)

SELECT @sql = '
    SELECT 
           pfs.SectionID, 
           pfs.SectionName, 
           pfs.Link,
           (
                SELECT 
                        pf.FieldID,
                        pf.FieldTitle,
                        pf.FieldSQL,
                        pf.Restricted,
                        pf.Optional,
                        (
                            SELECT 
                                pf.FieldSQL
                            FROM 
                                Resources.emp.EmployeeComplete as e
                            WHERE
                                e.QID = @QID
                        ) as Value
                FROM 
                    search.ProfileFields as pf
                WHERE 
                    pf.SectionID = pfs.SectionID
                ORDER BY
                    pf.[Order]
                FOR    XML PATH (''field''), ELEMENTS, TYPE, ROOT (''fields'')
           ) 
    FROM 
        search.ProfileFieldSections as pfs
    WHERE
        pfs.Status = 1
    FOR    XML PATH (''data''), ELEMENTS, TYPE, ROOT (''root'')'

PRINT @sql
EXECUTE sp_executesql @sql, N'@QID varchar(10)', @QID = @QID

Во внутреннем большинстве select. Я запрашиваю pf.FieldSQL. Я ищу фактическое значение, которое было получено родителем select.

search.ProfileFields имеет столбец с именем FieldSQL с несколькими результатами, такими как Name, Age, Location.

Это то, что я пытаюсь сделать самым внутренним select.

SELECT Name FROM ... - имя в этом случае происходит от значения pf.FieldSQL.

Как мне в этом случае запросить имя динамического столбца?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Посмотрите на операторов "PIVOT" здесь PIVOT Это должно дать вам несколько идей, как их использовать.

0 голосов
/ 03 июля 2018

Посмотрите на этот ответ , чтобы получить пару предложений. Если ваше определение таблицы сложное или иногда изменяется, вам, вероятно, следует использовать сводку. Вот тот, который может работать для вас, если имена столбцов в столбце FieldSQL четко определены, их не так много, и они никогда не изменяются и не добавляются:

DECLARE @sql nvarchar(max)

SELECT @sql = '
    SELECT 
       pfs.SectionID, 
       pfs.SectionName, 
       pfs.Link,
       (
            SELECT 
                pf.FieldID,
                pf.FieldTitle,
                pf.FieldSQL,
                pf.Restricted,
                pf.Optional,
                (
                    SELECT case pf.FieldSQL 
                        when 'Name' then e.Name
                        when 'DOB' then convert(nvarchar(10), e.DOB, 126)
                        -- ... etc.
                        -- NOTE: may need to aggregated depending on uniqueness of QID:
                        -- when 'Name' then min(e.Name)
                        -- when 'DOB' then convert(nvarchar(10), min(e.DOB), 126)
                        end
                    FROM 
                        Resources.emp.EmployeeComplete as e
                    WHERE
                        e.QID = @QID
                ) as Value
            FROM 
                search.ProfileFields as pf
            WHERE 
                pf.SectionID = pfs.SectionID
            ORDER BY
                pf.[Order]
            FOR    XML PATH (''field''), ELEMENTS, TYPE, ROOT (''fields'')
       ) 
    FROM 
        search.ProfileFieldSections as pfs
    WHERE
        pfs.Status = 1
    FOR    XML PATH (''data''), ELEMENTS, TYPE, ROOT (''root'')'

PRINT @sql
EXECUTE sp_executesql @sql, N'@QID varchar(10)', @QID = @QID
...