2012-04-27 74 views
0

我已经创建嵌套游标基本上比较一个表的另一个列值的列值,并返回最接近的匹配。替代SQL嵌套游标

表的内容被说:

(的ColumnName和值如下) 表A

**Names** 
MandarinOrange 
SweetApple 
SourApple 
AppleThatTasteslikeGrapes 

表B

**Names** 
PlainOrange 
SourOrange 
Grapple 
. 
. 
. 

所以光标1(外光标)取各并且与表2中的所有名称进行比较并返回最接近的匹配。光标2(内部)用于检索表2中的名称

我想看看,如果有acheive使用游标 (因为实在是太慢了)

+1

编辑您的问题,包括你的代码。 – 2012-04-27 16:42:41

+0

你能否详细说明你如何确定“最接近的匹配”?它是一个专有的溶液或者是它的一些基本逻辑被包括在从表A - 用于例如以名称名称的TableB中的值:'其中tableA_value LIKE“%” + tableB_value +“%”' – 2012-04-27 17:01:54

回答

0

避免光标始终是一个更好的做法,并在你的情况,我认为这是可以实现的相同avaoiding方式。关键在于您为了评估比较结果而执行的计算。

一种解决方案是创建一个函数有两个字符串并返回一个1/0值作为比较结果。然后你可以调用该函数作为SELECT语句的一部分并保存游标迭代。

下面是这样一个函数的一个例子:

CREATE FUNCTION fn_Compare 
(
    @firstValue  varchar(50), 
    @secondValue varchar(50) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 
    SET @Result = 0 --False by default 

    --!Here goes your specific logic for comparing string! 
    IF @firstValue = @secondValue 
     SET @Result = 1 

    RETURN @Result 

END 
GO 

--Use it in a sentance 
SELECT dbo.fn_Compare('TEST', 'TEST') AS Match --True 
SELECT dbo.fn_Compare('TEST', 'TEST2') AS Match --False 

--Use it in a query 
SELECT 
    name, 
    name, 
    dbo.fn_Compare(name, name) AS Match 
FROM sysobjects 
WHERE 
    Type = 'u' 

--Cleanup 
DROP FUNCTION fn_Compare 

我希望这有助于。