动态SQL-如何将结果中的值用作列名?

时间:2018-07-02 23:56:29

标签: sql-server stored-procedures sql-server-2012 dynamicquery

我正在为MsSQL存储过程进行动态SQL查询。

有一个表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,其中包含一些结果,例如NameAgeLocation

这就是我要尽我最大select做的事情。

SELECT Name FROM ...-在这种情况下,名称来自pf.FieldSQL的值。

在这种情况下如何查询动态列名?

2 个答案:

答案 0 :(得分:1)

请查看this answer的一些建议。如果表定义复杂或偶尔更改,则可能应使用数据透视表。只要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

答案 1 :(得分:0)

PIVOT处查看“ PIVOT”运算符 这应该给您一些使用方法的想法。