在 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 数据源以进行测试的主要内容,如果未能解决你的问题,请参考以下文章