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)
为什么它失败了
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 操作,我将您当前拥有的内容作为第二步包含在内。
归档时间: |
|
查看次数: |
196 次 |
最近记录: |