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

C# 用于选择多个记录的存储过程,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我需要从一个表中选择记录,比如说从c.net代码中选择具有匹配时间戳的2000条记录。 例如: 对于相同的时间戳,上述查询必须执行2000个以上的项 为此,我们可以使用 SELECT * FROM ITEMDATA_TABLE WHERE ITEMNAME in ('Item1','Item2','Item3','Item4',......) AND TimeStamp='2010-04-26 17:15:05.667' 来自SQLServerManagementStudio 我曾尝

我需要从一个表中选择记录,比如说从c.net代码中选择具有匹配时间戳的2000条记录。 例如:

对于相同的时间戳,上述查询必须执行2000个以上的项

为此,我们可以使用

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

我曾尝试将所有项名称附加到一个字符串变量,并将其作为存储过程的参数,但这导致了错误的串联

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

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

不要告诉你用另一种方式做,但是,如果您选择了所有具有要查找的时间戳的项,然后在c代码中迭代此记录集,这不是更容易吗?

如果从存储过程执行此操作,我将创建一个包含所有有效项名称的临时表,插入到该表中:仅插入一个表,并对其进行查询作为主表,已加入到ID/DateTime限定的主节点。然后删除临时表。

如果从存储过程中执行此操作,我将创建一个包含所有有效项名称的临时表,插入到该临时表中:仅插入一个表,并对该临时表进行查询,将其作为主临时表,连接到ID/DateTime限定的主临时表。然后删除临时表。

如果您使用的是SQL Server 2008,您没有提到您的版本,则可以使用


如果您使用的是SQL Server 2005或更低版本,请查看Erland Sommarskog关于如何处理存储过程中的参数列表的文章


您不能只是将它们作为字符串传递,这是行不通的。

如果您使用的是SQL Server 2008,您没有提到您的版本,那么可以使用


如果您使用的是SQL Server 2005或更低版本,请查看Erland Sommarskog关于如何处理存储过程中的参数列表的文章


您不能将它们作为字符串传入-这不起作用。

以下可能是您要查找的代码:

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

以下可能是您要查找的代码:

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

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

从ItemData_表中选择ItemData_表。* 交叉应用MyxmlParameter.nodes'item'数据I 其中ItemData_Table.ItemId=i.value'@ItemId',INT


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

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

从ItemData_表中选择ItemData_表。* 交叉应用MyxmlParameter.nodes'item'数据I 其中ItemData_Table.ItemId=i.value'@ItemId',INT


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

这可能更容易,但这是有争议的,但并不正确。最好让数据库返回正确的结果集。检索和过滤数据是数据库的工作。它还产生较少的网络流量,这实际上取决于已知的元信息量。在实践中,如果要返回该时间戳的所有内容(导致几行的少数项目除外),则返回所有内容并在调用者处过滤掉少数内容是更好的解决方案。当然,通过使用其他技术和在服务器上进行过滤来完全避免长列表通常是首选。这可能更容易,但这是有争议的,但并不正确。最好让数据库返回正确的结果集。检索和过滤数据是数据库的工作。它还产生较少的网络流量,这实际上取决于已知的元信息量。在实践中,如果要返回该时间戳的所有内容(导致几行的少数项目除外),则返回所有内容并在调用者处过滤掉少数内容是更好的解决方案。当然,通常首选通过使用其他技术和在服务器上进行过滤来完全避免长列表。