【问题标题】:SQL SERVER Table Valued Parameters (Table Type) in WHERE clauseWHERE 子句中的 SQL SERVER 表值参数(表类型)
【发布时间】:2018-01-26 01:11:34
【问题描述】:

表类型多值参数传递给 SP 可以在 SELECT 查询的 WHERE 子句中使用 TVP 吗?

例如:

SELECT * FROM PRODUCTS 
WHERE ProductCategoryId IN @tvpCategories

我的意思是,我们可以使用 TVP 代替子查询(示例如下)吗?

SELECT * FROM PRODUCTS 
WHERE ProductCategoryId IN (SELECT Id from ProductCategories)

感谢您的帮助

【问题讨论】:

  • 是的,你可以:SELECT * FROM PRODUCTS WHERE ProductCategoryId IN (SELECT Id from @tvpCategories)
  • 但是把它当作另一个表。因此,您必须从中为您的 IN 子句选择必填字段。
  • 这是一张桌子。加入它。
  • SELECT PRODUCTS.* FROM @tvpCategories 类别 LEFT JOIN PRODUCTS on PRODUCTS .ProductCategoryId = categories.id

标签: sql sql-server


【解决方案1】:

如果您不想使用子查询,那么联接将是另一种选择。

SELECT PRODUCTS.* 
FROM @tvpCategories categories 
LEFT JOIN PRODUCTS on PRODUCTS.ProductCategoryId = categories.id 

【讨论】:

    【解决方案2】:

    你可以像这样使用:

    SELECT * FROM PRODUCTS 
    WHERE ProductCategoryId IN (SELECT Id from @tvpCategories)
    

    表值参数在表中,对于编程,您可以将它们视为存储在内存中的临时表,直到执行范围完成。

    【讨论】:

      【解决方案3】:

      使用表值参数就像使用表变量一样,除了表值参数是只读的。

      这意味着您可以使用带有in 运算符的子查询:

      SELECT * 
      FROM PRODUCTS 
      WHERE ProductCategoryId IN (SELECT Id from @tvpCategories)
      

      或者使用连接:

      SELECT * 
      FROM PRODUCTS 
      INNER JOIN @tvpCategories tvp ON ProductCategoryId = tvp.Id
      

      【讨论】:

        猜你喜欢
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 2015-02-13
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多