【问题标题】:CROSS APPLY WITH UDF与 UDF 交叉应用
【发布时间】:2015-08-12 08:58:47
【问题描述】:
Create function  getbyID  ( @id int )
Returns table

as 
return( 
select * from Products where  

ProductID=@id+10)

上面的函数返回所有产品 ID 大于 10 的产品记录。

当与下面的 CROSS APPLY 一起使用时

select o.* from [Order Details] o 
CROSS APPLY getbyID(o.ProductID) P

我得到的结果是一些小于 10 的 productID,这是不可能的。

该示例使用随处可用的 NORTWIND 数据库示例。

ORDER DETAILS 表和 PRODCUTS 表由 ProductID 链接

Select* from getbyID (1)  gives result below

当 UDF 被调用时(如上)结果显示一些 productID

你能看出错误在哪里吗?

【问题讨论】:

  • 它完全有可能返回 Order Details 行,其中 ProductID 小于 10。你在这里得到的是不会返回 Order Details 行的产品68 - 77.
  • @Stephan 我想要的首先是 UDF 只返回 productID >= 10 。我检查了它工作正常。但是当与 cross apply 结合使用时,它会返回一些小于 10 的 productID。
  • @Damien 上面的代码应该返回与 productID >= 10 的内部连接相同的结果。这是我的目标
  • @JavaMain 我认为 Donal 的代码可能是您正在寻找的。​​span>
  • 再读一遍UDF。它说“如果你给我一个 ID 值为 1,返回 ID 值为 11 的行”,这显然有效。你可能只是让你的逻辑倒退(即,如果你减去 10,那么它会说“如果你给我一个 ID 值为 1,返回 ID 值为 -9 的行”,这些行显然不存在)跨度>

标签: sql sql-server tsql inner-join udf


【解决方案1】:

如果您希望您的函数只返回 ProductID 大于 10 的产品,则应将此检查添加到 where 子句。例如:

Create function  getbyID  ( @id int )
Returns table
as 
return( 
select * from Products 
where  
ProductID=@id AND
ProductID > 10)

【讨论】:

  • 我想你可能想把 ">" 改成 ">="
  • 为什么需要添加 productID >10 。因为 productID 值从 1 开始。
  • 您的代码正在运行。但我不明白为什么我的不起作用。
  • @JavaMain - 正如我在您的问题下面所说,再次阅读您的 UDF。如果@id 等于 1,您希望它返回什么结果? Products 表中是否有 ID 为 11 的条目?因为在这种情况下,这就是您的查询所要查找的内容。
  • 是的,有一个 productID = 11 的条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多