注意:这是在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或类似内容实际传递给下一个函数?编辑:修改上面的代码以包含更多信息。
答案 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的问题,而是你的函数需要返回一个表的问题。
干杯 -