【问题标题】:APPLY and Passing Arguments to Functions应用并将参数传递给函数
【发布时间】:2014-01-07 15:23:32
【问题描述】:

注意:这是在 SQL Server 2008 中。

我正在尝试使用 APPLY 运算符来允许我以合理的方式相互调用用户定义的内联表值函数,但它似乎并没有忠实地这样做。我正在使用 OUTER APPLY,但 CROSS APPLY 做同样的事情。这是相关的块:

SELECT addresses.Book,addresses.Page,foo.BookInput,foo.PageInput
FROM [dbo].bookPageFromAddress(@address) addresses
outer apply [dbo].[imageFileFromBookPage](addresses.Book, addresses.Page) foo

没有什么是奇怪的:

GO
CREATE FUNCTION [dbo].imageFileFromBookPage (@book nvarchar(max), @page nvarchar(max))
RETURNS TABLE AS RETURN(
    WITH ids AS (
        SELECT right('00000000'+ltrim(str(c.DocID)),8) as VarString,
               right('0000000000'+ltrim(str(i.ImageID)),12) as PathVar6        
        FROM [Resolution].[dbo].[Constant] c, [Resolution].[dbo].[Images] i
        WHERE ltrim(c.[Book]) like @book 
        AND ltrim(c.[Page]) like @page
        AND i.DocID = c.DocID
)
SELECT '/Images/' +
    substring(ids.VarString,1,2)+'/' +
    substring(ids.VarString,3,2)+'/' +
    substring(ids.VarString,5,2)+'/' +
    right(ids.VarString,8)+'/' +
    PathVar6 + '.tif' as ImageLocation
    ,@book as BookInput, @page as PageInput
FROM ids

);

因此,从本质上讲,imageFileFromBookPage 将其输入输出到 BookInput 和 PageInput。这是该外部应用在样本输入上的结果:

Book 4043
Page 125
BookInput NULL
PageInput NULL

注意 Book 和 Page 是字符串,而不是整数;他们只是碰巧在这里持有数字字符,但 BookInput 和 PageInput 实际上是 NULL,而不是字符串。起初我以为是打字问题; Book 和 Page 在它们的原始表中都是 nchar(10) ,我的两个函数都需要 nvarchar(max) 输入。但是,我尝试将参数转换为 nvarchar(max) 并得到相同的结果。

我是不是找错树了?我不熟悉 APPLY,但它确实看起来像我想要的,在这里。如何让 APPLY 或类似的东西真正将值传递给下一个函数?

编辑:修改上面的代码以包含更多信息。

【问题讨论】:

  • 不知道你在问什么
  • @Andomar:根据他的函数def,BookInput应该是4043而不是NULL,PageInput应该是125而不是NULL。
  • TToni 是正确的,Andomar。我的核心问题是“我如何让 APPLY 或类似的东西真正将值传递给下一个函数?” (我指的是用户定义的内联表值函数)。我对 APPLY 很好奇,但我会接受任何解决我问题的方法。如果我的帖子令人困惑,我很乐意对其进行编辑,但我不确定如何更清楚。
  • @TToni:啊哈。 quindraco,你能发布整个用户定义的函数吗?尤其是你如何使用return 语句。
  • 这在我刚刚编写的小测试中运行良好(也适用于 nchar(10) 与 nvarchar(max))。所以你的问题可能出在“不相关”的位上:-)。此处通常的调试技术是从一个简单的代码开始执行您想要的操作,然后处理您的实际代码直到出现问题,或者从您现有的代码开始。

标签: sql sql-server-2008


【解决方案1】:

查看 APPLY 文档,不应该将函数声明为:

CREATE FUNCTION [dbo].imageFileFromBookPage (@book nvarchar(max), @page nvarchar(max))
     returns @Data Table
     (
          book nvartchar(max),
          page nvarchar(max)
     )
as
begin
   insert into @Data
   select @book, @page;

end

换句话说,这不是APPLY的问题,而是你的函数需要返回一个Table的问题。

干杯-

【讨论】:

  • 由于看起来不清楚,我已经编辑了我的原始问题,不跳过“不相关的部分”,而是显示您正在谈论的声明。
  • 我确实想知道 :( 您没有将返回中的列定义为 AS 之前的序言的一部分,这会有所不同吗?
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2013-01-27
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多