我的separated中有一个字段,其中包含一个以逗号分隔的短2-4字母代码列表--让我们将其命名为CodeField。我还有一个多值报表参数,它的可用值是一组可能的代码- CodeParam。基本上,在我的SQL查询中,我需要包含一个WHERE条件,该条件包括在CodeField中的任何代码都在CodeParam中被选中的行。
我最初的方法是生成以下形式的条件(通过自定义代码或SSRS表达式中的联接):([CodeField] LIKE '%AA%') OR ([CodeField] LIKE '%BB%') OR .. (其中AA,BB,.是在CodeParam中选择的值,然后按照this answer包含它作为动态SQL。
然而,那里的评论表明动态生成的SQL通常是错误的,而且可能有更好的方法。
那么,解决这个问题的最好方法是什么呢?不要过分关注查询的性能;我主要是在寻找最简单/最干净的有效解决方案。
发布于 2019-04-25 15:07:28
因此,我肯定会提到,由于这个确切的原因,拥有一个包含多个数据点的列往往不是理想的。
无论如何,我建议做的事情如下:
下面是一个例子
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp
SELECT
*
, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowId
INTO #Temp
FROM (VALUES ('abc,def,ghi,jkl'), ('mno,pqr,stu,vwx')) AS MyTable(MyColumn);
WITH StringSplitWithRowId AS (
SELECT
RowId
, LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value'
FROM (
SELECT
RowId
, CAST('<M>' + REPLACE( MyColumn, ',', '</M><M>') + '</M>' AS XML) AS Data
FROM #Temp
) a
CROSS APPLY Data.nodes ('/M') AS Split(a)
),
RowIdsToInclude AS (
SELECT DISTINCT
RowId
FROM StringSplitWithRowId
WHERE Value IN (@SsrsReportParameter) -- query will not work in ssms, needs to be run in RS
)
SELECT
*
FROM #Temp t
INNER JOIN RowIdsToInclude i
ON t.RowId = i.RowIdhttps://stackoverflow.com/questions/55851198
复制相似问题