【问题标题】:Stored procedure for selecting multiple records选择多条记录的存储过程
【发布时间】:2010-04-26 12:06:30
【问题描述】:

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

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。

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

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

【问题讨论】:

    标签: c# sql-server stored-procedures


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

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

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

          从 ItemData_Table 中选择 ItemData_Table.* 交叉应用 MyxmlParameter.nodes('item') data(i) WHERE ItemData_Table.ItemId = i.value('@itemid', INT)

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

          【讨论】:

            猜你喜欢
            • 2010-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多