【问题标题】:How can I use table-valued function in SQL Server where clause如何在 SQL Server where 子句中使用表值函数
【发布时间】:2015-08-12 10:49:59
【问题描述】:

我有一个表值函数,它返回一组 id 数据。我想把函数放在我的查询中;

SELECT * 
FROM caritbl 
WHERE cari_id IN (dbo.fn_AtamaliCariListe(37))

有什么建议吗?

编辑:我正在使用 SQL Server

【问题讨论】:

  • 对不起,我忘了提。我修改了我的问题,你现在可以看到了。

标签: sql sql-server user-defined-functions table-valued-parameters


【解决方案1】:

在这种情况下,您可以像使用表格一样使用此功能。通常你会像这样执行查询编写;

select * from XTable x where x.col in (select y.col from YTable y)

当你使用表值函数时,你也可以这样做;

select * from XTable x where x.col in (select y.col from dbo.fn_YourFunction(idparameter) y)

并不是你的表值函数应该返回一个名为“col”的列的结果

【讨论】:

    【解决方案2】:

    只需对函数执行 SELECT 即可。

      --Sample Table
      SELECT 12 AS A
      INTO #Temp
    
      --Query here
      SELECT * FROM #Temp WHERE A IN(
      SELECT [transform].[Maximum] (10,12)) 
    

    这应该可以解决问题

    【讨论】:

      【解决方案3】:

      Aykut 的答案是大多数情况下的最佳答案。这是要注意等效的joinin 更复杂。应该是:

      SELECT DISTINCT c.*
      FROM caritbl c JOIN
           dbo.fn_AtamaliCariListe(37) as acl(id)
           ON c.cari_id = acl.id;
      

      注意DISTINCT。除非我们知道函数返回唯一值,否则我们需要它。

      现在,在某些情况下JOIN 实际上更好。如果函数是不确定的,SQL Server 可能会为IN 处理的每一行重复重新评估它。我不知道 SQL Server 是否会这样做,但这是可能的。 JOIN 确实保证该函数只被评估一次。

      【讨论】:

        【解决方案4】:

        你可以随时加入。

        select yourfields
        from yourtable join yourfunction on something
        where whatever
        

        这在逻辑上等价于你说你想做的。

        【讨论】:

          猜你喜欢
          • 2018-05-17
          • 1970-01-01
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多