【问题标题】:One SQL Server stored procedure to retrieve one item or multiple using table valued parameter使用表值参数检索一项或多项的 SQL Server 存储过程
【发布时间】:2018-03-19 20:19:41
【问题描述】:

如何将条件添加到单个存储过程以返回一个项目或加入 tvp 以返回多个项目?

所以我希望能够做到

Select *
From table
where id = @id

Select t.*
From table t
join tvp tvp on t.id = tvp.id

每次只为一个项目传递一个 tvp 会很糟糕,这样我就可以避免第一次查询吗?我是不是很懒惰,这应该只是两个不同的存储过程吗?

【问题讨论】:

  • 单行传递 tvp 有什么问题?
  • @SeanLange 这就是我问的原因。如果只有一行,使用 tvp 不会影响性能吗?在我的应用程序中,单行检索发生的次数远多于批量加载。
  • 您可以相信我的话,但是...尝试一下并检查您系统上的性能差异不是更简单、更快、更好吗?
  • @SeanLange 今天我必须在 COB 之前完成它!
  • 大声笑,所以你宁愿冒险互联网上有人给你可靠的建议,而不是自己测试?此时距您发布问题已有 23 分钟。您本可以编写一个快速测试并在不到 10 分钟内找到答案。在这里不要试图无用,但最好的性能答案来自于将要运行的系统上的测试。

标签: sql sql-server stored-procedures table-valued-parameters


【解决方案1】:

你可以这样做:

Select t.*
From table t
where id = @id or
      (@id is null and t.id in (select tvp.id from tvp));

【讨论】:

  • 别忘了在查询中添加OPTION(RECOMPILE)
  • 我宁愿使用连接,ID 的列表会变得很大
  • @user3093582 。 . .在这种情况下,joinin 应该具有几乎相同的性能。
【解决方案2】:

我之前用两个过程做过这个:第一个过程接受 TVP,另一个过程接受一个 ID,将其打包为 TVP 并调用第一个过程。我这样做是为了向后兼容,但它适用于这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多