SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice]
WHERE ([OfficeID] IN (@Office))
AND (('0003' in @Activity) OR ('0007' in @Activity))
ORDER BY [Name] ASC
这个sql脚本在检索数据源时会失败,弹出窗口会询问“@Activity”和“@Office”的定义,即使这些参数存在。
但如果我将'@Activity'视为单个非数组值,就像这样:
SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice]
WHERE ([OfficeID] IN (@Office))
AND ((@Activity ='0003') OR (@Activity = '0007'))
ORDER BY [Name] ASC
然后它不会提示定义,但如果我选择了多个Acitivity项目,它会在报告中报告语法中的','逗号并失败。
答案 0 :(得分:0)
如果@Activity是单个值,则可以使用
(@Activity IN ('0003', '0007'))
但如果@Activity是逗号分隔的值列表,则无论如何都不能将其作为单个参数传递。 SQL参数永远不能替代值列表 - 只有一个值。如果为参数传递的字符串看起来像数字列表,则无关紧要。它仍然只是一个值,恰好是一串数字和逗号。
你可以试试this trick,在Joel Spolsky本人的Stack Overflow上推广:
WHERE ',' + @Activity + ',' LIKE '%,' + '0003' + ',%'
OR ',' + @Activity + ',' LIKE '%,' + '0007' + ',%'
但它执行得非常糟糕,因为模式中的主要通配符强制进行表扫描。