在 TSQL 中重新创建 s-s-rS 数据源以进行测试

Posted

技术标签:

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

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

AND T.OrderType IN (@OrderType)

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

首先,在 s-s-rS 报告的数据集属性中,您可以使用将参数的值转换为用逗号分隔的多个字符串的表达式来修改参数:=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,','))

【讨论】:

以上是关于在 TSQL 中重新创建 s-s-rS 数据源以进行测试的主要内容,如果未能解决你的问题,请参考以下文章

TSQL 透视或估计模型复制

如何修改 s-s-rS 矩阵报表以显示总计的平均值?

TSQL 将列中的逗号分隔值与逗号分隔参数进行比较

循环遍历数据库列表以删除和重新创建视图

具有动态偏移量的 TSQL 复制 LAG() 函数

s-s-rS 报表生成器在我身上崩溃,现在它不会重新打开报表