Estoy obteniendo una salida NULL en una función SQL al concatenar campos
-
05-07-2019 - |
Pregunta
Tengo la siguiente función:
CREATE FUNCTION fGetTransactionStatusLog
(
@TransactionID int
)
RETURNS varchar(8000) AS
BEGIN
declare StatusChanges cursor for
select NewStatusID, FirstName + ' ' + LastName AS UserName, Stamp, CAST(Notes AS varchar(8000)) AS Notes
from TransactionStatusChanges tsc
left join Users us ON tsc.UserID = us.UserID
where TransactionID = @TransactionID ORDER BY StatusNum
declare @output varchar(8000)
declare @NewStatusID char(2)
declare @UserName varchar(255)
declare @Stamp datetime
declare @Notes varchar(8000)
set @output = ''
OPEN StatusChanges
FETCH NEXT FROM StatusChanges INTO @NewStatusID, @UserName, @Stamp, @Notes
WHILE @@FETCH_STATUS = 0
BEGIN
set @output = @output + RTRIM(CAST(@Stamp AS varchar(30))) + ': ' + @NewStatusID + ' by ' + @UserName + CHAR(13) + CHAR(10)
IF @Notes IS NOT NULL
BEGIN
set @output = @output + '---' + @Notes + CHAR(13) + CHAR(10)
END
FETCH NEXT FROM StatusChanges INTO @NewStatusID, @UserName, @Stamp, @Notes
END
CLOSE StatusChanges
DEALLOCATE StatusChanges
RETURN @output
END
Ahora, esa función devuelve exactamente lo que quiero para las Transacciones que no tienen Notas en ningún registro ... Para las transacciones que tienen al menos un registro en TransactionStatusChanges con un campo de Notas no NULL, obtengo NULL.
No lo entiendo del todo, ya que estoy comprobando que @Notes no es NULL antes de capturarlo.
¿Alguna idea?
NOTA: Estoy usando varchar (8000) porque no puedo usar texto dentro de Funciones.
Solución
Uno de estos es NULL
set @output = @output + RTRIM(CAST(@Stamp AS varchar(30))) + ': ' + @NewStatusID + ' by ' + @UserName + CHAR(13) + CHAR(10)
Además, puede simplificar su código utilizando ISNULL o COALESCE para manejar columnas que contienen NULL
CREATE FUNCTION fGetTransactionStatusLog
(
@TransactionID int
)
RETURNS varchar(8000) AS
BEGIN
declare @output AS varchar(8000)
select @output = ISNULL(@output, '')
+ ISNULL(RTRIM(CAST(Stamp AS varchar(30))), '<NULL>')
+ ISNULL(NewStatusID, '<NULL>') + ' by '
+ ISNULL(FirstName + ' ' + LastName, '<NULL>') + CHAR(13) + CHAR(10)
+ ISNULL('---' + Notes + CHAR(13) + CHAR(10), '')
from TransactionStatusChanges tsc
left join Users us ON tsc.UserID = us.UserID
where TransactionID = @TransactionID ORDER BY StatusNum
RETURN @output
END
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow