RIGHT() 在 SELECT 中有效但在 UPDATE 中无效?

Mat*_*ete 5 sql-server t-sql sql-server-2008-r2

我正在尝试运行一个脚本,该脚本执行一些工作,包括从列的每一行内的字符串中去除前导两个字符。为此,我正在使用RIGHT()它,当我在 a 中使用它时它工作正常,SELECT..FROM但是当我在 a 中使用相同的代码时UPDATE它失败了

传递给 RIGHT 函数的长度参数无效

为什么它失败了UPDATE但不是SELECT...FROM

USE JobSight;

DROP TABLE #ReleaseTemp;


SELECT  A.MajRelease,  
        A.MinRelease,
        A.Build,
        Split.a.value('.', 'VARCHAR(MAX)') AS ReleaseNotes
INTO #ReleaseTemp
FROM  
        (
            SELECT  MajRelease,
                    MinRelease,
                    Build,  
                    CAST ('<M>' + REPLACE(RelNotes, ';;', '</M><M>') + '</M>' AS XML) AS ReleaseNotes
            FROM JobsDB.dbo.ReleaseData
        ) AS A 
    CROSS APPLY ReleaseNotes.nodes ('/M') AS Split(a);

UPDATE #ReleaseTemp
SET ReleaseNotes = RIGHT(ReleaseNotes, LEN(ReleaseNotes) - 2);

UPDATE #ReleaseTemp
SET ReleaseNotes = LTRIM(#ReleaseTemp.ReleaseNotes);

SELECT  MajRelease,
        MinRelease,
        Build,
        RIGHT(ReleaseNotes, LEN(ReleaseNotes) - 2) AS ReleaseNots
FROM #ReleaseTemp
WHERE #ReleaseTemp.ReleaseNotes <> '';
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 8

为什么它失败了UPDATE但不是SELECT...FROM

因为在您中,SELECT您正在通过WHERE #ReleaseTemp.ReleaseNotes <> ''. 您的UPDATE语句中没有该过滤器,并且您可能至少有一行长度为 0 或 1。尝试制作:

UPDATE #ReleaseTemp
SET ReleaseNotes = LTRIM(RIGHT(ReleaseNotes, LEN(ReleaseNotes) - 2))
WHERE LEN(#ReleaseTemp.ReleaseNotes) > 1;
Run Code Online (Sandbox Code Playgroud)

<> ''我没有检查,而是更改了过滤器以确保字符串的长度至少为 2 个字符。这避免了字符串只有一个字符的情况,该字符不等于空字符串,''但在将 -1(长度为 1 减 2)传递给RIGHT函数时仍会出现该错误。

请注意,LTRIM()为了避免第二次 DML 操作,我将您当前拥有的内容作为第二步包含在内。