Estou tentando executar um script que faz algum trabalho, incluindo remover os dois caracteres iniciais da string dentro de cada linha de uma coluna. Para fazer isso, estou usando RIGHT()
e funciona bem quando uso em um, SELECT..FROM
mas quando uso esse mesmo código dentro de um UPDATE
, ele falha com
Parâmetro de comprimento inválido passado para a função DIREITA
por que está falhando no, UPDATE
mas não no 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 <> '';
Porque no seu
SELECT
você está filtrando as linhas viaWHERE #ReleaseTemp.ReleaseNotes <> ''
. Você não tem esse filtro em suaUPDATE
instrução e provavelmente tem pelo menos uma linha com comprimento 0 ou 1. Tente fazer isso:Em vez de verificar
<> ''
, alterei o filtro para garantir que o comprimento da string seja de pelo menos 2 caracteres. Isso evita a situação em que a string tem apenas um caractere que não equivale a uma string vazia,''
mas ainda obteria esse erro ao passar um -1 (do comprimento de 1 menos 2) para aRIGHT
função.Observe que incluí o
LTRIM()
que você tem atualmente como uma segunda etapa para evitar essa segunda operação DML.Para fazer atualizações com seleção e evitar ambiguidade, eu uso a abordagem abaixo que aprendi, espero que isso ajude você também. Isso não está relacionado à sua pergunta.
Pequeno teste:
O 'cte' referido no código é uma Common Table Expression .