代码之家  ›  专栏  ›  技术社区  ›  SBB

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

  •  2
  • SBB  · 技术社区  · 6 年前

    我正在为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 是的。我在寻找父母收到的实际价值 选择 是的。

    搜索.profilefields 有一个名为 FieldSQL 有一些结果,比如 Name ,请 Age 我是说, Location 是的。

    这就是我最想要的 选择 去做。

    SELECT Name FROM ... -本例中的名称来自 字段SQL 是的。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   pcdev    6 年前

    看一看 this answer 有几个建议。如果表定义很复杂或偶尔更改,则可能应该使用pivot。这里有一个可能对您有用,只要 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
    
        2
  •  0
  •   Danielson Sanches    6 年前

    看看这里的“pivot”操作符 PIVOT 这会给你一些如何使用它们的想法。