Visual studio 2008 有关此sql语法的帮助

Visual studio 2008 有关此sql语法的帮助,visual-studio-2008,sql-server-2008,ssrs-2008,Visual Studio 2008,Sql Server 2008,Ssrs 2008,此sql脚本将无法检索数据源,弹出窗口将询问'@Activity'和'@Office'的定义,即使这些参数存在 但如果我将“@Activity”视为单个非数组值,如下所示: SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice] WHERE ([OfficeID] IN (@Office)) AND (('0003' in @Activity) OR ('0

此sql脚本将无法检索数据源,弹出窗口将询问'@Activity'和'@Office'的定义,即使这些参数存在

但如果我将“@Activity”视为单个非数组值,如下所示:

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

然后它将不会提示输入定义,但在报告中,如果我选择多个活动项,它将报告语法中的“,”逗号并失败。

如果@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
但是,如果@Activity是一个逗号分隔的值列表,则无论如何都不能将其作为单个参数传递。SQL参数永远不能替代值列表——只能替换一个值。如果为参数传递的字符串看起来像一个数字列表,那么这无关紧要。它仍然只是一个值,恰好是一个由数字和逗号组成的字符串

您可以尝试,Joel Spolsky自己在Stack Overflow上推广:

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

但是它的性能非常糟糕,因为模式中的前导通配符强制进行表扫描。

感谢这一教育技巧,但我发现我所要做的就是在(@Activity))中插入@Activity,比如('0003'),这样它才能正常工作>\u不要指望它能在任何其他品牌的数据库上工作。
WHERE ',' + @Activity + ',' LIKE '%,' + '0003' + ',%'
   OR ',' + @Activity + ',' LIKE '%,' + '0007' + ',%'