Sql 传递多个值以获得CSV输出
这是一个带有参数@MID的存储过程 我正在使用SSRS生成报告。Sql 传递多个值以获得CSV输出,sql,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,这是一个带有参数@MID的存储过程 我正在使用SSRS生成报告。 如果将单个值传递给参数,则其工作正常 比如说- 事务表 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
如果将单个值传递给参数,则其工作正常 比如说- 事务表
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
如果我使用
Exec 4
结果正是我所期望的
1 | 50 | 30 | 11 | 30
2 | 51 | 39 | 100 | 30
但是我需要将多个值传递给参数像
exec 4,5,6
期望的结果应该是
TranID | MonthValue
1 | 50 **-- ie Aprils value**
如何获得这样的结果???存储过程必须具有有限数量的预定义参数,而且,您试图实现的目标并不保证存储过程是正确的。 更好的解决方案是将值存储在表
中创建表(mid smallint,monthtext varchar(20))
并查找所需内容
注意:从外观上看,您还可以使用datetime功能返回月份1-12的编号
DECLARE@Mth smallint
设置@Mth=11
选择DateName(mm,DATEADD(mm,@Mth,-1))作为[MonthName]
您可以在定义中定义多个值,默认值为null,以便只传入所需的项数
TranID | MonthValue
1 | 50,30,11 ***-->Comma Separated values of columns
然后检查这些值是否为空
我同意使用系统功能可能是更好的解决方案。您可以使用拆分功能,例如
create procedure fred
(
@i1 int = null,
@i2 int = null,
@i3 int = null,
...
下面是一个使用声明变量和动态SQL获取所需输出的快速示例:
EXEC dbo.procedurename @param = '4,5,6';
结果:
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;
那么您需要在逗号分隔的列表中以与输入相同的顺序对输出进行排序吗?e、 g.如果你通过了7,5,4,你会期望30,30,50的产量,还是可以按月订购(50,30,30)?另外,你有每年的表格吗?如果有人输入了11,12,1,您是否必须将查询拆分为两个事务表?根据我所知,您将CSV数据存储在文本列中。这是个坏习惯。您应该以适当的关系形式存储数据,即具有多个引用事务ID的“MonthValue[s]”的表。@DrewR no,他们希望以CSV形式输出。整数分别存储在名为
Jan
、Feb
等列中。充其量设计也有问题,但据我所知,它们没有存储CSV。
EXEC dbo.procedurename @param = '4,5,6';
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