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

这是一个带有参数@MID 的存储过程,我使用它来使用SSRS 生成报告。
如果将单个值传递给参数,则它可以正常工作。

例如-

交易表

TranID | Apr |  May  | Jun   | Jul  

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

如果我执行
Exec 4
结果是我所期望的

TranID  |  MonthValue    

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

但是我需要将多个值传递给参数,
例如

exec 4,5,6

和期望的结果应该是

TranID  |  MonthValue        

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

我怎样才能达到这样的结果?

4

3 回答 3

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]

于 2013-04-05T10:14:46.690 回答
0

您可以在定义中定义多个值,默认值为 null,因此您只需传入所需的项目数。

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

然后检查值是否为空。

位我同意使用系统功能可能是一个更好的解决方案。

于 2013-04-05T12:31:39.960 回答
0

您可以使用拆分功能,例如

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
    );

然后将您的参数作为单个字符串而不是单独的参数传递(根据这篇文章,您可以使用 SSRS 轻松完成此操作):

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

这是一个使用声明的变量和动态 SQL 来获得所需输出的快速示例:

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(N'./text()[1]', N'nvarchar(max)'),1,5,N'') + '
 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 演示

于 2013-04-05T13:05:23.930 回答