【问题标题】:Alternative to SQL Nested CursorSQL 嵌套游标的替代方案
【发布时间】:2012-04-27 16:38:03
【问题描述】:

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

表格内容如下:

(列名和值如下) 表A

**Names**
MandarinOrange
SweetApple
SourApple
AppleThatTasteslikeGrapes

表 B

**Names**
PlainOrange
SourOrange
Grapple
.
.
.

所以 Cursor1(外部光标)从 table1 中获取每个名称,并与 Table2 中的所有名称进行比较,然后返回最接近的匹配项。Cursor 2(内部)是检索表 2 中的名称

我想看看,是否有办法使用光标实现相同的避免 (因为太慢了)

【问题讨论】:

  • 编辑您的问题以包含您的代码。
  • 您能否详细说明您如何确定“最接近的匹配”?它是专有解决方案还是一些基本逻辑 tableB 中 name 的值包含在 tableA 的名称中-例如:where tableA_value like '%'+tableB_value+'%'

标签: tsql cursor sql-server-2000


【解决方案1】:

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

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多