将标量函数应用于每一行
Posted
技术标签:
【中文标题】将标量函数应用于每一行【英文标题】:Apply scalar function to each row 【发布时间】:2011-08-01 23:45:22 【问题描述】:我有一个像这样工作的函数:select score from comparestrings(@String1,@string2)
我需要将表中的每一行(@string2)与@string1 进行比较。没有While循环和游标是否可能?
我的函数来自simmetrics library
函数代码如下:
ALTER FUNCTION
[dbo].[BlockDistance](@firstword [nvarchar](255), @secondword [nvarchar](255))
RETURNS [float] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [TextFunctions].[StringMetrics].[BlockDistance]
【问题讨论】:
你可以使用 CROSS APPLY 和表值函数 你能举个小例子吗?我正在执行以下操作:SELECT b.score FROM MyTable a CROSS APPLY BlockDistance ('sample text', a.SampleText) b 并获取:无效的对象名称。我在网上发现我应该将标量函数转换为表值函数才能使其工作,但我实际上如何转换呢? 【参考方案1】:comparestrings 是返回表格的 UDF 吗?
相反,只需让它返回 scalar value
并执行以下操作:
select comparestrings(@string1, tablestring) from yourtable
【讨论】:
请注意我对我的问题 (***.com/questions/1230787/udf-performance-in-mysql) 的回复,这表明 UDF 可能会对性能产生影响。不确定这是否仍然是 SQL-2008 引擎的问题?【参考方案2】:不要逐行调用。
存储它如果输入是常量或来自同一行的列,则使用computed column逐行存储。
ALTER TABLE Mytable ADD
Score AS comparestrings(Col1,Col2)
然后你可以持久化它并索引它
【讨论】:
不,不幸的是,这些是动态的,来自不同的表和数据库以上是关于将标量函数应用于每一行的主要内容,如果未能解决你的问题,请参考以下文章