Tsql T-SQL子字符串()行为

Tsql T-SQL子字符串()行为,tsql,substring,Tsql,Substring,在我读过的书中,我遇到了一些代码,这些代码让我质疑了SUBSTRING()函数的行为。代码应该搜索NYSIIS替换表(语音编码示例),并根据表中的位置“End”“Mid”或“Start”替换输入字符串的中间“N-gram”。摘录如下: NYSIIS替换表: Location NGram Replacement Mid A A Mid AW AA Mid E A Mid EV AF Mid EW AA Mid

在我读过的书中,我遇到了一些代码,这些代码让我质疑了
SUBSTRING()
函数的行为。代码应该搜索NYSIIS替换表(语音编码示例),并根据表中的位置“End”“Mid”或“Start”替换输入字符串的中间“N-gram”。摘录如下:

NYSIIS替换表:

Location NGram Replacement Mid A A Mid AW AA Mid E A Mid EV AF Mid EW AA Mid I A 更换NGram的位置 中段 美国中部 中东 中电动汽车自动对焦 西南偏中AA 中段
使用[AdventureWorks]
声明@Result NVARCHAR(100)=N'NEVADA';
宣布更换NVARCHAR(10);
声明@i INT;
设置@i=1;

而@iorderby
子句使用模式的长度并按降序排序,因此最长匹配将首先出现。
TOP
子句将结果限制在第一行。删除
ORDER BY
子句会使结果不可预测


COALESCE
用于将
@Replacement
设置为替换模式,或者设置
@Result
字符串中
@i
位置的字符(如果未找到模式匹配)。

这是有意义的。谢谢我假设没有TOP或orderby的结果是无序的,尽管每次运行时我只返回2个字母的字符串。
USE [AdventureWorks]

DECLARE @Result NVARCHAR(100) = N'NEVADA';

DECLARE @Replacement NVARCHAR(10);

DECLARE @i INT;

SET @i = 1;

WHILE @i <= LEN (@Result)

BEGIN

    SET @Replacement = NULL;

    -- Grab the middle-of-name replacement n-gram

    SELECT TOP(1)  @Replacement = Replacement                   
    FROM dbo.NYSIIS_Replacements                         
    WHERE Location = N'Mid'
        AND SUBSTRING(@Result, @i, LEN(NGram)) = NGram
    ORDER BY LEN(NGram) DESC;


    SET @Replacement = COALESCE(@Replacement, SUBSTRING(@Result, @i, 1));   


    -- If we found a replacement, apply it

    SET @Result = STUFF(@Result, @i, LEN(@Replacement), @Replacement) 

    -- Move on to the next n-gram

    SET @i = @i + COALESCE(LEN(@Replacement), 1);


END;

SELECT @Result;