应用并将参数传递给函数

时间:2014-01-07 15:23:32

标签: sql sql-server-2008

注意:这是在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)输入。我尝试将参数CASTing为nvarchar(max)并得到相同的结果。

我是在叫错树吗?我不熟悉APPLY,但它确实看起来像我想要的,在这里。如何将APPLY或类似内容实际传递给下一个函数?

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

1 个答案:

答案 0 :(得分:0)

查看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的问题,而是你的函数需要返回一个表的问题。

干杯 -