在“应用查询”中使用动态列名称

时间:2017-04-29 11:30:56

标签: sql sql-server

我有一个要求,我需要在DB中检查授权。但是,授权字段包含逗号分隔值。因此,要提取并添加where子句,我使用了CROSS-APPLY,如split-comma-separated-list所示,它工作正常。

查询类似于

SELECT EmployeeID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(Certs,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM some_table
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

稍后我需要从另一个表动态获取“Certs”列。所以,我再添加一个select来获取列名。但是当我在REPLACE函数中写入它时,它返回值,即列名。我需要将其视为列名并获取与其对应的值。

修改后的查询类似于

SELECT EmployeeID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
(SELECT DatabaseColumnName FROM column_name_table WHERE ID = 98) YY ---Returns "Certs"
CROSS APPLY
FROM
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(YY.DatabaseColumnName,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM some_table
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

重复我之前的评论:你需要使用动态sql,如果这个代码暴露给用户输入,你需要非常小心动态sql以避免sql注入。

如果所有DatabaseColumnName的{​​{1}}都相同,那么您可以获取该列名并将其连接到执行的sql,如下所示:

EmployeeID

Dynamic Sql Reference:

如果您想要更多选项来分割您现在使用的方法以外的字符串:

分裂字符串: