我正在为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
,其中包含一些结果,例如Name
,Age
,Location
。
这就是我要尽我最大select
做的事情。
SELECT Name FROM ...
-在这种情况下,名称来自pf.FieldSQL
的值。
在这种情况下如何查询动态列名?
答案 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”运算符 这应该给您一些使用方法的想法。