2016-10-05 3 views
0

Ich habe eine Abfrage, die 3 Parameter Startdatum, Enddatum und Standort hat. Die Abfrage wird in SQL Stored Procedure gespeichert, und ich rufe die Stored Procedure in SSRS (EXEC dbo.ups_Calls @Start, @End, @Location) auf (siehe unten stehenden Code).Mehrfacher Wert in einem Parameter

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 

PROBLEM: Der Aufruf der gespeicherten Prozedur aus SSR Query-Box (siehe unten) nur eine Seite von der SSRS Lageparameter ziehen, obwohl ich mehr als einen Standort ausgewählt, aber wenn ich die Abfrage selbst in SSRS einbetten dann Ich bin in der Lage, mehrere Websites zu ziehen.

enter image description here

Antwort

0

Wenn Sie eine gespeicherte Prozedur verwenden, muss es in der Lage sein, mehrere Parameter zu handhaben. SSRS geht in der Regel Mehrwertparameter als durch Komma getrennte Werte, so dass Sie die folgende Funktion in Kombination mit der gespeicherten Prozedur verwenden, könnten die Werte zu verarbeiten:

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 

Stored Procedure:

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 
Verwandte Themen