Sql server 在TSQL中重新创建SSRS数据源以进行测试

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'''; 但是,这未

我有一个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';
您基本上希望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中的值转储到表变量中。我将编辑我的答案来说明这一点。