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.

È stato utile?

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
scroll top