【发布时间】: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