zoukankan      html  css  js  c++  java
  • Reporting Services 的多值参数究竟能否用在数据集获取途径为存储过程的情景呢?

    编写映射到多值报表参数的查询

    您可以为要创建的任何报表参数定义多值参数。不过,如果要将多个参数值传回查询,则必须满足下列要求:

    • 数据源必须为 SQL Server、Oracle 或 Analysis Services。
    • 数据源不能是存储过程。Reporting Services 不支持将多值参数数组传递给存储过程。
    • 查询必须使用 IN 语句来指定参数。

    MSDN有上述的描述,可见多值参数必须用于数据集查询文本为Select ... Where XXXId in (@Parameters)的典型应用,

    如果用到存储过程就会报类型(ID参数是字符串型)无法转换等错误;

    如获取数据为 exec dbo.pGetOrders @OrderID    (存储过程内容见如下代码)

    USE [AdventureWorks]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER PROCEDURE [dbo].[spGetOrders]
        
    @OrderIDs varchar(500= ''
    AS
    BEGIN
        
    SET NOCOUNT ON;
        
        
    DECLARE @sql varchar(500)

        
    SET @sql = 'SELECT * FROM Sales.SalesOrderDetail';
        
    IF @OrderIDs <> '' SET @sql = @sql + ' WHERE [SalesOrderID] IN (' + @OrderIDs + ')';
        
    EXEC (@sql);
        
        
    SET NOCOUNT OFF;
    END;

    上面问题通过笔者反复琢磨,找到一种变通的办法:

    增加一个“内部”参数,将其设置为级联参数(必须排列在上面提到的多值参数之后),如@InnerOrderIDs类型为String,可用值和默认值都设置为表达式如下:

    =Join(Parameters!OrderID.Value,  ", ")

    然后修改获取数据的SQL为 exec dbo.pGetOrders @InnerOrderIDs就大功告成!

  • 相关阅读:
    Windows命令行乱码问题解决
    Mysql中in语句排序
    MyBatis批量修改操作
    MyBatis联合查询association使用
    【转】Nginx 安装配置
    【转】解决编译安装NGINX时make报错
    【转】ora-00031:session marked for kill处理oracle中杀不掉的锁
    IOC-AOP
    【转】 linux之sed用法
    【转】Nginx+Tomcat+Memcached集群Session共享
  • 原文地址:https://www.cnblogs.com/chriskwok/p/1388220.html
Copyright © 2011-2022 走看看