2011-02-28 87 views
3

我有一個標量UDF負責返回一個NVARCHAR(MAX)獨特的詞在它。不要問爲什麼。 :)這裏可以避免使用CURSOR嗎?

樣品輸入: 「比薩菠蘿香腸比薩奶酪」

輸出樣本: 「比薩菠蘿香腸奶酪」。

這裏的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

只是尋找最有效的方式來實現要求。

回答

2

這是可以做到替換光標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 
+0

如何'FOR XML'性能比較光標? – RPM1984 2011-02-28 04:28:32

+0

@ RPM1984:你將不得不基準,但如果它不是更快,我會感到驚訝...... – 2011-02-28 04:29:16

+0

nps。那麼我現在就和這個一起去。乾杯! – RPM1984 2011-02-28 04:30:52

相關問題