用于选择多个记录的存储过程

时间:2010-04-26 12:06:30

标签: c# sql-server stored-procedures

我需要从c#.net代码中匹配时间戳的表中选择记录2000。 例如:

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

上述查询必须针对相同的时间戳执行更多2000个项目。

为此我们可以使用

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

来自SQL Server Management Studio。

我尝试将所有Item名称附加到一个字符串变量并将其作为参数提供给存储过程,但结果导致了错误的连接。

如何将此作为从.net代码执行的存储过程? 有谁能建议我/纠正我这样做?

5 个答案:

答案 0 :(得分:6)

如果您使用的是SQL Server 2008(未提及您的版本),则可以使用table-valued parameters

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

你不能只是将它们作为字符串传递 - 这不起作用。

答案 1 :(得分:1)

如果从存储过程中执行此操作,我将创建一个包含所有有效项目名称的临时表,插入到该表中(即:只是一个表),然后对其进行查询作为主要,加入到主服务器ID / DateTime限定。然后删除临时表。

答案 2 :(得分: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'''
    ;

答案 3 :(得分:0)

不要告诉你以另一种方式做到这一点,但如果您选择了所有带有您正在寻找的时间戳的项目,然后在您的c#代码中迭代此记录集,这会不会更容易?

答案 4 :(得分:0)

在SQL 2005中,您可以将item列表作为XML参数传递给存储过程,然后针对xml参数编写查询。像这样的东西

SELECT ItemData_Table。* FROM ItemData_Table     交叉申请MyxmlParameter.nodes('item')数据(i) WHERE ItemData_Table.ItemId = i.value('@ itemid',INT)

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