大小写表达式中的MSSQL子选择

大小写表达式中的MSSQL子选择,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,我在这里有点挣扎 我得到了一个基于参数返回一些值的查询。参数按预期工作。它们由MS SQL Reporting Services提供 其工作原理如下: SELECT T0.CardName FROM OCRD T0 WHERE T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) -- <-- MSSQL View ORDER BY T0.[CardName] 我试图提供命名参数,如'CR',ZV',GR'等。不过,在后台,表达式

我在这里有点挣扎

我得到了一个基于参数返回一些值的查询。参数按预期工作。它们由MS SQL Reporting Services提供

其工作原理如下:

SELECT 
T0.CardName
FROM OCRD T0 
WHERE
T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) -- <-- MSSQL View
ORDER BY 
T0.[CardName]
我试图提供命名参数,如'CR',ZV',GR'等。不过,在后台,表达式应该返回一个值列表。因此。。。在(…)语句中输入Carcode

我已经知道SSRS级别的解决方法,比如提供带有复选框的值列表等。但我希望用户只选择一个命名参数,这样他们就不必与数百个结果斗争

有什么想法吗

编辑: 我选择了最适合我的需求,因为它有一个简洁的解释和关于我可以做得更好的建议

WHERE (@VB = 'CR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) ) OR
      (@VB = 'GR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_GR) ) OR
      (@VB = 'ZV' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_ZV) )

SQL Server不支持将布尔类型或布尔表达式作为单个值。相反,请使用基本布尔逻辑:

WHERE (@VB = 'CR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) ) OR
      (@VB = 'GR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_GR) ) OR
      (@VB = 'ZV' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_ZV) )
然而,这可能不是最好的解决方案。您可能应该使用适当的“VB”值将所有代码存储在一个表中。那么逻辑就是:

T0.[CardCode] IN (SELECT cardcode FROM USK_Codes c WHERE c.vb = @vb) 

拥有多个具有相同列集的表通常是数据模型出现问题的标志。

这可能是某些动态SQL的候选者,具体取决于使用这些卡代码的表的数量:

DECLARE @CardCode sysname = 'CR';

DECLARE @SQL nvarchar(MAX);
SELECT @SQL = N'
SELECT OCRD.CardName
FROM OCRD
WHERE OCRD.CardCode IN (SELECT sq.CardCode FROM ' + QUOTENAME(v.[name]) + N' sq)
ORDER BY OCRD.ItemCode;' --You reference T2 alias here, however, that isn't in yoru query, so where is it from...?
FROM sys.views v
WHERE v.[name] = N'USK_Codes_' + @CardCode;

EXEC sp_executesql @SQL;

您还可以将其编写为CTE,并在卡代码表上使用union查询

WITH 
card_code_list  --you may want to make this a view
AS
(
  SELECT [VB] = 'CR', cardcode from USK_Codes_CR
  UNION SELECT [VB] = 'GR', cardcode from USK_Codes_GR
  UNION SELECT [VB] = 'ZV', cardcode from USK_Codes_ZV
)
SELECT 
  T0.CardName
FROM 
  OCRD T0 
  INNER JOIN card_code_list ccl ON T0.[CardCode] = ccl.[cardcode] AND ccl.[VB] = @VB
ORDER BY 
  T0.[Cardname]

案例表达,而不是陈述。我在回答中的评论中注意到了这一点,但是
T2.[ItemCode]
来自哪里?查询中只有一个对象
OCRD
;由于某种原因,您将其命名为
T0
。(我希望您没有使用递增整数来为表别名…)示例查询中没有对象或别名
T2
。啊,sry!将查询减少到最小值。忽略T2!是的,这里的一个问题更像是“请在定制报告中添加一些东西来做这个和那个”。这是一个“成熟”的东西。另一个问题是,这是一个由特定员工负责的客户代码列表。这些习惯每周都会改变。所以在这种情况下,视图对我来说是最简单的事情(我想)。谢谢你的回答和简洁的解释!谢谢你的回答!这正是戈登的建议,但我更喜欢他的解释,所以我选择了他的答案。
DECLARE @CardCode sysname = 'CR';

DECLARE @SQL nvarchar(MAX);
SELECT @SQL = N'
SELECT OCRD.CardName
FROM OCRD
WHERE OCRD.CardCode IN (SELECT sq.CardCode FROM ' + QUOTENAME(v.[name]) + N' sq)
ORDER BY OCRD.ItemCode;' --You reference T2 alias here, however, that isn't in yoru query, so where is it from...?
FROM sys.views v
WHERE v.[name] = N'USK_Codes_' + @CardCode;

EXEC sp_executesql @SQL;
WITH 
card_code_list  --you may want to make this a view
AS
(
  SELECT [VB] = 'CR', cardcode from USK_Codes_CR
  UNION SELECT [VB] = 'GR', cardcode from USK_Codes_GR
  UNION SELECT [VB] = 'ZV', cardcode from USK_Codes_ZV
)
SELECT 
  T0.CardName
FROM 
  OCRD T0 
  INNER JOIN card_code_list ccl ON T0.[CardCode] = ccl.[cardcode] AND ccl.[VB] = @VB
ORDER BY 
  T0.[Cardname]