2016-10-05 77 views
0

我有一个查询,它有3个参数开始日期,结束日期和位置。查询存储在SQL存储过程中,并且我正在调用SSRS中的存储过程(EXEC dbo.ups_Calls @Start,@End,@Location)(请参见下面的代码)。参数中的多个值

CREATE PROC dbo.Calls 
    @Start DATETIME=NULL, 
    @End DATETIME=NULL, 
    @Location VARCHAR(25)=NULL 
AS 
BEGIN 

SELECT CALLDATE, LOCATION 
FROM CALL_DETAILS WITH (NOLOCK) 
WHERE CALLDATE BETWEEN @START AND @END 
AND LOCATION IN (@Location) 

END 
GO 

问题:调用来自SSR查询框在存储过程(见下文),仅从即使我选择了多个位置的SSRS位置参数拉着一个网站,但如果我嵌入在SSRS查询本身则我可以拉多个网站。

enter image description here

回答

0

当你使用存储过程,它需要能够处理多个参数。 SSRS通常通过多值参数,逗号分隔值,所以你可以使用下面的函数与存储过程结合,以处理该值:

CREATE FUNCTION [dbo].[udf_Split] 
( 
    @RowData NVARCHAR(MAX), 
    @Delimeter NVARCHAR(MAX) 
) 
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1), 
    Data NVARCHAR(MAX) 
) 
AS 
BEGIN 
    DECLARE @Iterator INT 
    SET @Iterator = 1 

    DECLARE @FoundIndex INT 
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData) 

    WHILE (@FoundIndex>0) 
    BEGIN 
     INSERT INTO @RtnValue (data) 
     SELECT 
      Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1))) 

     SET @RowData = SUBSTRING(@RowData, 
       @FoundIndex + DATALENGTH(@Delimeter)/2, 
       LEN(@RowData)) 

     SET @Iterator = @Iterator + 1 
     SET @FoundIndex = CHARINDEX(@Delimeter, @RowData) 
    END 

    INSERT INTO @RtnValue (Data) 
    SELECT Data = LTRIM(RTRIM(@RowData)) 

    RETURN 
END 
GO 

存储过程:

CREATE PROC dbo.Calls 
    @Start DATETIME=NULL, 
    @End DATETIME=NULL, 
    @Location VARCHAR(25)=NULL 
AS 
BEGIN 

SELECT CALLDATE, LOCATION 
FROM CALL_DETAILS WITH (NOLOCK) 
WHERE CALLDATE BETWEEN @START AND @END 
AND LOCATION IN (SELECT DATA FROM [dbo].[udf_Split](@Location,',')) 

END 
GO