2010-04-26 51 views
1

我需要从c#.net代码中匹配时间戳的表中选择记录,说2000。 如:选择多个记录的存储过程

SELECT * 
FROM ITEMDATA_TABLE 
WHERE ITEMNAME='Item1' and TimeStamp='2010-04-26 17:15:05.667' 

上面的查询必须执行2000年项目多为相同的时间戳。

这一点,我们可以从SQL Server Management Studio中使用

SELECT * 
FROM ITEMDATA_TABLE 
WHERE ITEMNAME in ('Item1','Item2','Item3','Item4',......) 
    AND TimeStamp='2010-04-26 17:15:05.667' 

我已经尝试了所有附加的项目名称,将一个字符串变量,并给它作为参数传递给存储过程,但它导致成一个错误的级联。

我怎么能做到这一点从.NET代码执行存储过程? 任何人都可以建议我/纠正我这样做吗?

回答

0

不告诉你做的另一种方式,但不会,如果你选择与你正在寻找的时间戳的所有项目这是更容易,然后迭代这个记录在你的C#代码中设置?

+0

它可能更容易(这是有争议的),但它不会是正确的。最好让数据库返回正确的结果集。检索和过滤数据是数据库的功能。它也会产生更少的网络流量。 – APC 2010-04-26 12:20:28

+0

这确实取决于知道多少元信息。如果在实践中除了少数几行产生的时间戳之外的所有内容都将被返回,那么返回所有内容并在调用者处过滤少量内容是更好的解决方案。当然,通过在服务器上使用其他技术和过滤完全避免长的IN列表通常是优选的。 – 2010-04-26 14:59:11

1

如果从存储过程中这样做,我会创造一切合法项目名称的临时表,插入即(即:只是一个单一的表),并做了询问针对作为主,加入到主其中ID/DateTime限定。然后删除临时表。

6

如果你的SQL Server 2008(你没有提到你的版本),你可以使用table-valued parameters

如果您使用的是SQL Server 2005或更低版本,请查阅Erland Sommarskog的excellent articles,了解如何处理存储过程中的参数列表。

你不能仅仅把它们放到一个字符串 - 不工作。

1

以下可能是你正在寻找的代码:

SET @SQLString = N'SELECT * 
    FROM table1 
    WHERE timet = @time and items in (@item)'; 


DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

SET @ParmDefinition = N'@time timestamp, 
    @item varchar(max) '; 


EXECUTE sp_executesql 
    @SQLString 
    ,@ParmDefinition 
    ,@time = '2010-04-26 17:15:05.667' 
    ,@item = '''Item1'',''Item2'',''Item3'',''Item4''' 
    ; 
0

SQL 2005中,您可以通过项目的列表作为XML参数的存储过程,然后编写针对XML参数的查询。像这样

SELECT ItemData_Table。* FROM ItemData_Table CROSS APPLY MyxmlParameter.nodes( '项目')数据(i) WHERE ItemData_Table.ItemId = i.value( '@ itemid的',INT)

这里MyxmlParameter是从.NET代码传递给存储过程的XML。