【问题标题】:Recreating SSRS Data Source in TSQL for testing在 TSQL 中重新创建 SSRS 数据源以进行测试
【发布时间】:2012-03-12 18:26:10
【问题描述】:

我有一个 SSRS 数据源,我想在 SQL Server 中对其进行测试,以便查看准确的结果集。我正在使用的报告在报告中使用了一个多值参数,该参数作为子句传递到查询中

AND T.OrderType IN (@OrderType)

我想做的是在 SQL 语句的顶部声明一个要在此处引用的变量。这是我尝试过的方法的一个示例,但它不起作用

DECLARE @OrderType VARCHAR(255); SET @OrderType = '''StringValue1'',''StringValue2''';

但是,这未能产生预期的结果(未返回任何记录)

我可以创建变量并让它成功返回单一类型的行,但通常我希望在测试数据源时看到与在 SSRS 中相同的行为。下面是成功返回单个订单类型的代码

DECLARE @OrderType VARCHAR(255); SET @OrderType = 'StringValue1';

【问题讨论】:

    标签: sql-server sql-server-2008 reporting-services ssrs-2008


    【解决方案1】:

    您基本上希望您的 WHERE 子句看起来像这样: WHERE T.OrderType IN ('StringValue1','StringValue2',StringValue3')。 如果您将 SSRS 参数转换为逗号分隔的列表并使用表变量,则可以轻松完成此操作。

    首先,在 SSRS 报告的数据集属性中,您可以使用将参数的值转换为用逗号分隔的多个字符串的表达式来修改参数:=Join(Parameters!OrderType.Value,",")

    在您的测试脚本中模仿这种行为:SET @OrderType = 'String1, String2, String3'

    接下来,将@OrderType 的内容转换为带有UDF 的表变量,该UDF 将逗号分隔的列表解析为变量。您应该能够在网络上找到许多此类函数的示例。

    一旦你填充了你的表变量(我们称之为@tblOrderType),你可以像这样使用WHERE子句:T.OrderType IN (SELECT OrderType FROM @OrderType)

    【讨论】:

    • 目标是有一个 WHERE 子句,其中传入一个变量,例如 AND T.orderType IN (@OrderType)。当我尝试用一​​个字符串中的 StringValues 构建一个 VARCHAR(255) 变量时,我的逗号分隔它不返回任何结果。
    • 重新考虑这一点,最好这样设置您的测试变量:SET @OrderType = 'String1, String2, String3'。然后将@OrderType 中的值转储到表变量中。我将编辑我的答案来说明这一点。
    【解决方案2】:

    您无法完全按照您的要求进行操作,因为 T-SQL 本身不会将单个参数扩展为 IN 子句中的值数组。

    但是,Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters 上的这篇文章(作者 Erland Sommarskog)可能会让您接近。

    【讨论】:

      【解决方案3】:

      创建下面的函数。

      创建函数 [dbo].[拆分] ( @InputString nvarchar(max), @Delimiter nvarchar(50) )

      返回 @Items 表 ( 项目 nvarchar(最大) )

      作为 开始 如果 @Delimiter = ' ' 开始 SET @Delimiter = ',' SET @InputString = REPLACE(@InputString, ' ', @Delimiter) 结束

        IF (@Delimiter IS NULL OR @Delimiter = '')
              SET @Delimiter = ','
      
      
        DECLARE @Item                 nvarchar(max)
        DECLARE @ItemList       nvarchar(max)
        DECLARE @DelimIndex     INT
      
        SET @ItemList = @InputString
        SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
        WHILE (@DelimIndex != 0)
        BEGIN
              SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
              INSERT INTO @Items VALUES (@Item)
      
              SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+LEN(@Delimiter), LEN(@ItemList)-@DelimIndex)
              SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
        END -- End WHILE
      
        IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
        BEGIN
              SET @Item = @ItemList
              INSERT INTO @Items VALUES (@Item)
        END
      
        -- No delimiters were encountered in @InputString, so just return @InputString
        ELSE INSERT INTO @Items VALUES (@InputString)
      
        RETURN
      

      结束

      在存储过程中使用这个 select 语句

      Select * from TableName where AND T.OrderType IN (select * from dbo.Split(@OrderType,','))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 2015-09-02
        • 2015-04-26
        相关资源
        最近更新 更多