Sto ottenendo un output NULL in una funzione SQL quando si concattano i campi
-
05-07-2019 - |
Domanda
Ho la seguente funzione:
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
Ora, quella funzione restituisce esattamente quello che voglio per le Transazioni che non hanno Note in nessun record ... Per le transazioni che hanno almeno un record in TransactionStatusChanges con un campo Note non NULL, ottengo NULL.
Non capisco bene, dato che sto controllando che @Notes non sia NULL prima di accattarlo.
Qualche idea?
NOTA: sto usando varchar (8000) perché non riesco a usare il testo all'interno di Funzioni.
Soluzione
Uno di questi è NULL
set @output = @output + RTRIM(CAST(@Stamp AS varchar(30))) + ': ' + @NewStatusID + ' by ' + @UserName + CHAR(13) + CHAR(10)
Inoltre, puoi semplificare il tuo codice usando ISNULL o COALESCE per gestire le colonne che contengono 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow