我正在尝试使用存储过程来接受日期的多值参数.这不是在SSRS中,但我试图使用与它相同的方法:
ALTER PROCEDURE spSelectPlacementData ( @ClientID SMALLINT,@SourceFileDates VARCHAR(MAX) ) AS BEGIN SELECT (snip) FROM [APS].[dbo].[Account] A WHERE ClientID = @ClientID AND A.[SourceFileDate] IN (SELECT * FROM dbo.Split(@SourceFileDates)) END
我在SSRS报告多值参数上使用此方法和INT和VARCHAR字段.
这是我用来连接SourceFileDates的代码:
string sourceFileDates = ""; foreach (DateTime file in job.sourceFiles) { if (file == job.sourceFiles.Last()) { sourceFileDates += "'" + file.ToString("d") + "'"; } else { sourceFileDates += "'" + file.ToString("d") + "',"; } } selectruncommand = new sqlCommand("spSelectPlacementData",sqlConnection); selectruncommand.CommandType = CommandType.StoredProcedure; selectruncommand.Parameters.Add("@ClientID",sqlDbType.SmallInt); selectruncommand.Parameters["@ClientID"].Value = job.clientID; selectruncommand.Parameters.Add("@SourceFileDates",sqlDbType.VarChar); selectruncommand.Parameters["@SourceFileDates"].Value = sourceFileDates;
使用这个dbo.Split功能我在网上抓了:
/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 09/20/2011 11:16:13 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[Split] /* This function is used to split up multi-value parameters */ ( @ItemList VARCHAR(MAX),@delimiter CHAR(1) ) RETURNS @IDTable TABLE (Item VARCHAR(MAX) collate database_default ) AS BEGIN DECLARE @tempItemList VARCHAR(MAX) SET @tempItemList = @ItemList DECLARE @i INT DECLARE @Item VARCHAR(MAX) SET @tempItemList = REPLACE (@tempItemList,@delimiter + ' ',@delimiter) SET @i = CHARINDEX(@delimiter,@tempItemList) WHILE (LEN(@tempItemList) > 0) BEGIN IF @i = 0 SET @Item = @tempItemList ELSE SET @Item = LEFT(@tempItemList,@i - 1) INSERT INTO @IDTable(Item) VALUES(@Item) IF @i = 0 SET @tempItemList = '' ELSE SET @tempItemList = RIGHT(@tempItemList,LEN(@tempItemList) - @i) SET @i = CHARINDEX(@delimiter,@tempItemList) END RETURN END
我想我不完全清楚我如何格式化参数,SSRS如何对类似参数这样做(这是我从代码中尝试过的唯一一个),以及Date数据类型如何影响所需格式.我收到了“从字符串转换日期和/或时间时转换失败”.选择多个值时出错.
编辑:根据要求,foreach循环输出的示例:
‘9/9/2011’,‘8/19/2011’,‘8/12/2011’
解决方法
为什么不使用
Table-Valued parameter?
create type DateTimes as table ( [Value] datetime )
然后修改您的存储过程:
ALTER PROCEDURE spSelectPlacementData ( @ClientID SMALLINT,@SourceFileDates DateTimes readonly -- must be readonly )
现在,您可以将@SourceFileDates视为只读表变量.
指定sqlCommand参数时,Table-Valued参数指定为SqlDbType.Structured
并作为DataTable
或DataRowcollection
传递.因此,您可以像这样填充它:
var sourceFileDates = new DataTable(); sourceFileDates.Columns.Add("Value",typeof(DateTime)); foreach (DateTime file in job.sourceFiles) { sourceFileDates.Rows.Add(file); } selectruncommand.Parameters.Add(new sqlParameter { ParameterName = "@SourceFileDates",Value = sourceFileDates,sqlDbType = sqlDbType.Structured // make sure you specify structured });
现在一切都很好并且输入正确…而且您不必进行任何字符串解析或转换.
作为旁注,你也可以继续创建字符串和整数类型;你会迷上TVP并在整个地方使用它们.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。