帮助这个SQL语法

时间:2011-06-21 02:09:03

标签: visual-studio-2008 sql-server-2008 ssrs-2008

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项目,它会在报告中报告语法中的','逗号并失败。

1 个答案:

答案 0 :(得分:0)

如果@Activity是单个值,则可以使用

(@Activity IN ('0003', '0007'))

但如果@Activity是逗号分隔的值列表,则无论如何都不能将其作为单个参数传递。 SQL参数永远不能替代值列表 - 只有一个值。如果为参数传递的字符串看起来像数字列表,则无关紧要。它仍然只是一个值,恰好是一串数字和逗号。

你可以试试this trick,在Joel Spolsky本人的Stack Overflow上推广:

WHERE ',' + @Activity + ',' LIKE '%,' + '0003' + ',%'
   OR ',' + @Activity + ',' LIKE '%,' + '0007' + ',%'

但它执行得非常糟糕,因为模式中的主要通配符强制进行表扫描。

相关问题