performance - 这里可以避免使用 CURSOR 吗?

标签 performance tsql sql-server-2008 string cursor

我有一个标量 UDF,它负责返回其中包含唯一单词NVARCHAR(MAX)。别问为什么。 :)

示例输入:“披萨菠萝萨拉米披萨奶酪奶酪”

示例输出:“披萨菠萝萨拉米奶酪”。

这是 UDF:

ALTER FUNCTION [dbo].[ToUniqueString]
(
    @NonUniqueString NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @ReturnValue NVARCHAR(MAX)

    -- Split the string by spaces.
    DECLARE @Words TABLE (Word NVARCHAR(MAX))
    INSERT INTO @Words
    SELECT Word FROM dbo.SplitText(@NonUniqueString , ' ')

    -- Cursor through the records, creating a unique string.
    DECLARE @CurrentWord NVARCHAR(MAX)
    DECLARE @UniqueString NVARCHAR(MAX) = ''

    DECLARE WordCursor CURSOR FOR SELECT DISTINCT Word FROM @Words
    OPEN WordCursor
    FETCH NEXT FROM WordCursor INTO @CurrentWord
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @UniqueString = @UniqueString + ' ' + @CurrentWord

        FETCH NEXT FROM WordCursor INTO @CurrentWord
    END
    CLOSE WordCursor
    DEALLOCATE WordCursor

    RETURN RTRIM(LTRIM(@UniqueString ))
END

没有光标可以完成吗? WHILE 循环效率更高吗? FOR XML 怎么样?

只是寻找最有效的方法来实现需求。

最佳答案

可以用FOR XML替换光标来完成:

ALTER FUNCTION [dbo].[ToUniqueString] 
( 
    @NonUniqueString NVARCHAR(MAX) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @ReturnValue NVARCHAR(MAX) 

    -- Split the string by spaces. 
    DECLARE @Words TABLE (Word NVARCHAR(MAX)) 
    INSERT INTO @Words 
    SELECT Word FROM dbo.SplitText(@NonUniqueString , ' ') 

    DECLARE @UniqueString NVARCHAR(MAX) = '' 

    set @UniqueString = 
    stuff( 
        (SELECT Distinct  ' ' + Word
         FROM @Words 
         for xml path('')) 
    , 1, 1, '')   

    RETURN @UniqueString
END 

关于performance - 这里可以避免使用 CURSOR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5138125/

相关文章:

sql - SQL何时写入 'like'而不仅仅是 '='

sql - 在查询中使用 CTE(公用表表达式)

sql-server - SQL 复制 'The process could not connect to Subscriber'

sql-server - 索引会提高varchar(max)查询性能吗,以及如何创建索引

sql-server - 如何使用非自动增量 ID 执行插入语句?

performance - OAuth 性能

performance - 如何在AS3中控制声速和音量?

javascript - 比较列表时我的 Node.js 会锁定吗?

javascript - PostMan 脚本的响应时间

c# - 如何使用sql从四个sql表在rdlc中显示销售摘要