Sql server 在TSQL中重新创建SSRS数据源以进行测试
我有一个SSRS数据源,我想在SQL Server中进行测试,以便查看确切的结果集。我使用的报表在报表中使用了一个多值参数,该参数作为子句传递到查询中Sql server 在TSQL中重新创建SSRS数据源以进行测试,sql-server,sql-server-2008,reporting-services,ssrs-2008,Sql Server,Sql Server 2008,Reporting Services,Ssrs 2008,我有一个SSRS数据源,我想在SQL Server中进行测试,以便查看确切的结果集。我使用的报表在报表中使用了一个多值参数,该参数作为子句传递到查询中 AND T.OrderType IN (@OrderType) 我想做的是在SQL语句的顶部声明一个要在此处引用的变量。这是一个我尝试过但不起作用的方法的例子 DECLARE @OrderType VARCHAR(255); SET @OrderType = '''StringValue1'',''StringValue2'''; 但是,这未
AND T.OrderType IN (@OrderType)
我想做的是在SQL语句的顶部声明一个要在此处引用的变量。这是一个我尝试过但不起作用的方法的例子
DECLARE @OrderType VARCHAR(255); SET @OrderType = '''StringValue1'',''StringValue2''';
但是,这未能产生所需的结果,没有返回任何记录
我可以创建变量并让它成功返回单个类型的行,但通常我希望在测试数据源时看到与在SSRS中相同的行为。下面是成功返回单个订单类型的代码
DECLARE @OrderType VARCHAR(255); SET @OrderType = 'StringValue1';
您基本上希望WHERE子句如下所示:
其中T.OrderType位于“StringValue1”、“StringValue2”和“StringValue3”中。
如果将SSRS参数转换为逗号分隔的列表并使用表变量,则可以轻松完成此操作
首先,在SSRS报告中的dataset属性中,您可以使用表达式修改参数,该表达式将参数的值转换为多个由逗号分隔的字符串:=JoinParameters!OrderType.Value
要在测试脚本中模拟此行为,请设置@OrderType='String1、String2、String3'
接下来,使用UDF将@OrderType的内容转换为表变量,UDF将逗号分隔的列表解析为变量。您应该能够在web上找到许多此类函数的示例
填充表变量后,我们将其称为@tblOrderType,您可以在从@OrderType选择OrderType中使用WHERE子句,如下所示:T.OrderType。您基本上希望WHERE子句如下所示:
其中T.OrderType位于“StringValue1”、“StringValue2”和“StringValue3”中。
如果将SSRS参数转换为逗号分隔的列表并使用表变量,则可以轻松完成此操作
首先,在SSRS报告中的dataset属性中,您可以使用表达式修改参数,该表达式将参数的值转换为多个由逗号分隔的字符串:=JoinParameters!OrderType.Value
要在测试脚本中模拟此行为,请设置@OrderType='String1、String2、String3'
接下来,使用UDF将@OrderType的内容转换为表变量,UDF将逗号分隔的列表解析为变量。您应该能够在web上找到许多此类函数的示例
填充表变量后,我们将其称为@tblOrderType,您可以在@OrderType中的SELECT OrderType中使用WHERE子句:T.OrderType。创建下面的函数 创建函数[dbo].[Split] @输入字符串nvarcharmax, @分隔符nvarchar50 返回@Items表 物品nvarcharmax 作为 开始 如果@Delimiter='' 开始 设置@Delimiter=',' 设置@InputString=REPLACE@InputString,'',@分隔符 结束
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
结束
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 dbo中选择*from TableName where和T.OrderType。Split@OrderType,,,,创建下面的函数 创建函数[dbo].[Split] @输入字符串nvarcharmax, @分隔符nvarchar50 返回@Items表 物品nvarcharmax 作为 开始 如果@Delimiter='' 开始 设置@Delimiter=',' 设置@InputString=REPLACE@InputString,'',@分隔符 结束
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
结束
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 dbo中选择*from TableName where和T.OrderType。Split@OrderType,,,,,您不能完全按照您的要求执行,因为t-SQL本身不会将单个参数扩展到IN子句中的值数组中
然而,这篇由Erland Sommarskog撰写的文章可能会让您很接近。您不能完全完成您想要做的事情,因为t-SQL本身不会将单个参数扩展到IN子句中的值数组中
但是,这篇关于Erland Sommarskog的文章可能会让您接近。目标是在WHERE子句中传递一个变量,例如@orderType中的AND T.orderType。当我尝试构建一个VARCHAR255变量,其中StringValues在一个以逗号分隔的字符串中,它不会返回任何结果。重新考虑一下,最好将测试变量设置为:set@OrderType='String1,String2,String3'。然后将@OrderType中的值转储到表变量中。我将编辑我的答案来说明这一点。目标是在WHERE子句中传递一个变量,例如@orderType中的AND T.orderType。当我尝试构建一个VARCHAR255变量时,在一个字符串中用逗号分隔StringValues,它不会返回任何结果 r测试变量如下:SET@OrderType='String1,String2,String3'。然后将@OrderType中的值转储到表变量中。我将编辑我的答案来说明这一点。