我有一个要求,我需要在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)
非常感谢任何帮助!
答案 0 :(得分:0)
重复我之前的评论:你需要使用动态sql,如果这个代码暴露给用户输入,你需要非常小心动态sql以避免sql注入。
如果所有DatabaseColumnName
的{{1}}都相同,那么您可以获取该列名并将其连接到执行的sql,如下所示:
EmployeeID
Dynamic Sql Reference:
如果您想要更多选项来分割您现在使用的方法以外的字符串:
分裂字符串:
string_split()
in SQL Server 2016 : Follow-Up #1 - Aaron Bertrand