Tsql SQL嵌套游标的替代方法

Tsql SQL嵌套游标的替代方法,tsql,cursor,sql-server-2000,Tsql,Cursor,Sql Server 2000,我创建了嵌套游标,它基本上将一个表的列值与另一个表的列值进行比较,并返回最接近的匹配项 表格内容如下: (列名称和值如下所示) 表A 表B **Names** PlainOrange SourOrange Grapple . . . 因此,游标1(外部游标)从表1中获取每个名称,并与表2中的所有名称进行比较,然后返回最接近的匹配项。游标2(内部游标)用于检索表2中的名称 我想看看,是否有一种方法可以用光标实现同样的效果 (因为它太慢了)避免使用光标始终是一种更好的做法,在您的情况下,我认为这也

我创建了嵌套游标,它基本上将一个表的列值与另一个表的列值进行比较,并返回最接近的匹配项

表格内容如下:

(列名称和值如下所示) 表A

表B

**Names**
PlainOrange
SourOrange
Grapple
.
.
.
因此,游标1(外部游标)从表1中获取每个名称,并与表2中的所有名称进行比较,然后返回最接近的匹配项。游标2(内部游标)用于检索表2中的名称

我想看看,是否有一种方法可以用光标实现同样的效果
(因为它太慢了)

避免使用光标始终是一种更好的做法,在您的情况下,我认为这也是可以实现的。关键是为了评估比较结果而执行的计算

一种解决方案是创建一个函数,该函数接受两个字符串并返回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

我希望这能有所帮助。

编辑您的问题,将您的代码包括在内。您能否详细说明如何确定“最接近的匹配项”?它是专有解决方案还是一些基本逻辑?tableB中的名称值包含在tableA中的名称中--例如:
其中tableA的值类似于“%”+tableB的值+“%”
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