Report Builder 3.0底层SQL

时间:2013-08-09 20:27:53

标签: sql reporting-services reportbuilder3.0

我有一个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。

1 个答案:

答案 0 :(得分:1)

你对(@parameter)'中的事物的谓词的假设是正确的。实际上是在' value1',' value2'等等。只要@parameter允许多个值。但是,您可以将参数绑定到查询以及使用代码。您可以拥有除主数据集之外的数据集,例如简单的“从值中选择值”'其中值是参数选择所需的值表。除非你必须进行字符串拆分,否则这通常会更有效率。