我有一个report builder 3.0报告,上面有几个参数。具体而言,帐号(在数据库中定义为char(12))。该数据库是供应商提供的数据库,因此我无法控制数据库架构。
我的问题是,当我有一个帐号id的自由格式参数时,如何将其转换为发送到sql数据库的查询?
我处理这些自由格式字段的方式是我有一个用户定义的函数:
Public Function ConvertStringtoArray(sourceString as String) As string()
Dim arrayOfStrings() As String
Dim emptyString as String = " "
If String.IsNullOrEmpty(sourceString) Then
arrayOfStrings = emptyString.Split(",")
Else
arrayOfStrings = sourceString.Replace(" ", "").Split(",")
End If
return arrayOfStrings
End Function
参数定义为: @AcctList = code.ConvertStringToArray(Parameters!AcctList.Value)
sql查询在where子句中有这个: Ac.Account_ID In(@AcctList)
我的问题是它是如何构建In子句的。它的字面意思是: 其中Ac.Account_ID In(N'Acct1',N'Acct2')。
我认为它是,并且我认为重要的是当我在SSMS中运行它时查询将在不到1秒内运行,如果我的where子句具有Where Ac.Account_ID In('TGIF')。但是如果我有Ac.Account_ID In(N'TGIF')那么它需要13秒以上。返回的总数据集仅为917行。
我正在查询的数据库是2008 R2 SP2,其兼容性设置为SQL 2008。
答案 0 :(得分:1)
你对(@parameter)'中的事物的谓词的假设是正确的。实际上是在' value1',' value2'等等。只要@parameter允许多个值。但是,您可以将参数绑定到查询以及使用代码。您可以拥有除主数据集之外的数据集,例如简单的“从值中选择值”'其中值是参数选择所需的值表。除非你必须进行字符串拆分,否则这通常会更有效率。