2013-04-05 6 views
0
Create procedure temp 
(
@MID smallint 
) 
as 
Begin 

select TranID, 
[MonthValue]=(CASE WHEN @MID=1 THEN Jan 
    WHEN @MID=2 THEN Feb 
    WHEN @MID=3 THEN Mar 
    WHEN @MID=4 THEN Apr 
    WHEN @MID=5 THEN May 
    WHEN @MID=6 THEN Jun 
    WHEN @MID=7 THEN Jul 
    END) 
    FROM 
    TblTran as M 
where TranID=1 and 
     M.Month = @MID 
end 

이 매개 변수는 SSRS를 사용하여 보고서를 생성하는 데 사용하는 @MID 매개 변수가있는 저장 프로 시저입니다.
단일 값이 매개 변수로 전달되면 제대로 작동합니다. 예 -여러 값을 전달하여 CSV 출력을 얻으십시오.

트랜잭션 테이블

TranID | Apr | May | Jun | Jul 

1  | 50 | 30 | 11 | 30 
2  | 51 | 39 | 100 | 30 

내가
Exec 4
결과로 실행하면 내가 기대하는 것입니다

TranID | MonthValue  

1  | 50 **-- ie Aprils value** 

하지만 I 파라미터

exec 4,5,6


에 여러 값을 통과해야하고, 원하는 결과는이 같은 결과 acheive하는 방법

TranID | MonthValue   

1  | 50,30,11  ***-->Comma Separated values of columns 

되어야 ??

+0

그래서 당신은 입력과 같은 순서로 주문해야합니다, 쉼표로 분리 된 목록에서 출력을해야합니까? 예 : 7, 5, 4를 합격하면 30,30,50의 출력을 기대 하시겠습니까? 그렇지 않으면 달 단위로 주문할 수 있습니까 (50, 30, 30)? –

+0

또한 매년 1 년 동안 테이블이 있습니까? 누군가가 11,12,1에 합격하면 두 트랜잭션 테이블을 통해 쿼리를 분할해야합니까? –

답변

0

등의 분할 기능을 사용할 수 있습니다.여기

EXEC dbo.procedurename @param = '4,5,6'; 

출력을 얻기 위해 선언 된 변수와 동적 SQL을 사용하여 간단한 예입니다

CREATE FUNCTION dbo.SplitInts 
(
    @List  VARCHAR(MAX), 
    @Delimiter VARCHAR(32) 
) 
RETURNS TABLE 
AS 
    RETURN 
    (
     SELECT Item = CONVERT(INT, Item) 
     FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
      CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))) 
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) 
      FROM sys.all_objects) AS n(Number) 
     WHERE Number <= CONVERT(INT, LEN(@List)) 
     AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter 
    ) AS y 
    ); 

그런 다음 하나의 문자열이 아닌 별도의 매개 변수 (you can do this easily with SSRS according to this post)로 당신의 매개 변수를 전달 원하는 :

CREATE TABLE dbo.TransactionsTest 
(TranID INT PRIMARY KEY, Apr INT, May INT, Jun INT, Jul INT); 

INSERT dbo.TransactionsTest VALUES 
(1,50,30,11 ,30), 
(2,51,39,100,30); 


DECLARE @months VARCHAR(32) = '4,5,6'; 



DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql = 'SELECT TranID,MonthValue=' + STUFF(
(SELECT '+'',''+RTRIM(' 
    + CONVERT(CHAR(3),DATENAME(MONTH, DATEADD(MONTH, Item-1, 0))) + ')' 
    FROM dbo.SplitInts(@months,',') 
    ORDER BY Item 
    FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'),1,5,'') + ' 
    FROM dbo.TransactionsTest ORDER BY TranID;'; 

PRINT @sql; 

EXEC sp_executesql @sql; 

결과 :

-- printed in messages pane: 

SELECT TranID,MonthValue=RTRIM(Apr)+','+RTRIM(May)+','+RTRIM(Jun) 
    FROM dbo.TransactionsTest ORDER BY TranID; 

-- grid/text results: 

TranID MonthValue 
------ ---------- 
1  50,30,11 
2  51,39,100 

SQLfiddle demo

+0

우아한 솔루션입니다 .. – vstsdev

0

저장 프로 시저에는 한정된 수의 미리 정의 된 매개 변수가 있어야하며 이외에도 달성하려고하는 것은 저장 프로 시저를 보증하지 않습니다. 더 나은 해결책은 테이블에 값을 저장하고 create table (mid smallint, monthtext varchar(20))하고 필요한 것을 찾아 보는 것입니다.

참고로 보면 datetime 기능을 사용하여 1-12 개월의 숫자를 반환 할 수 있습니다. 당신은 단지 당신이 원하는 항목의 수에 전달할 수 있도록

DECLARE @Mth smallint SET @Mth = 11 SELECT DateName(mm,DATEADD(mm,@Mth,-1)) as [MonthName]

+0

질문이 약간 변경되었습니다 ... 제발 좀 봐주세요 ..... 감사합니다 – vstsdev

+0

텍스트 열에 CSV 데이터를 저장하고 있다고 말할 수 있습니다. 이것은 나쁜 습관입니다. 거래 ID를 참조하는 'MonthValue [s]'가 여러 개인 테이블을 적절한 관계형 형식으로 저장해야합니다. –

+0

@DrewR 아니요, 그들은 CSV 형식으로 * 출력 *을 원합니다. 정수는'Jan','Feb' 등의 열에 별도로 저장됩니다. 의심스런 디자인도 있지만 CSV를 저장할 수는 없습니다. –

0

당신은 널 (null)의 부도 정의에 여러 값을 정의 할 수 있습니다.

create procedure fred 
(
    @i1 int = null, 
    @i2 int = null, 
    @i3 int = null, 
... 

그런 다음 값이 null인지 확인하십시오.

비트 시스템 기능을 사용하는 것이 더 나은 해결책 일 수 있음에 동의합니다.

관련 문제