Mam tabelę EmployeeAudit jak poniżej:

Id      EmployeeId      
1       100
2       101

Mam 2 zmienną poniżej:

DECLARE @Version INT = 10;
DECLARE @isAuditDone BIT = 0;
//logic to populate Version and isAuditDone

W oparciu o powyższą zmienną chcę sprawdzić, czy Audyt został wykonany, a następnie zwrócić Id z EmployeeAudit jak poniżej:

if @isAuditDone
    return Id + '.' + Version = 1.10
else 
    return Id

Pytanie:

select 
    (CASE
          WHEN @isAuditDone = 1
                THEN E.Id + '.' + @Version
          WHEN @isAuditDone = 0
                THEN E.Id
          ELSE 
                E.Id
          END) AS Id, 
          EmployeeId
    from 
    EmployeeAudit E

Ale otrzymuję poniżej błąd:

Konwersja nie powiodła się podczas konwertowania wartości varchar „.” na typ danych int.

Czy ktoś może pomóc?

Aktualizacja :

EXEC [dbo].[GetEmployeeAuditJson] @employeeId = 101

Typ zwrotu SP w dniu select statement:

FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES;
0
ILoveStackoverflow 26 styczeń 2022, 21:20
2
Czy ten kod jest w procedurze składowanej? Nie możesz zwrócić ciągu znaków z procedury składowanej, return jest używane dla kodów statusu/błędu i obsługuje tylko int. Również return Id + '.' + Version = 1.10 nie płynie. Wypróbuj SELECT CONCAT(Id, '.', @Version);
 – 
Aaron Bertrand
26 styczeń 2022, 21:22
Dzieki za sugestie. Próbowałem tego, co sugerowałeś, ale nadal otrzymuję błąd: Konwersja nie powiodła się podczas konwersji wartości varchar „1.10” na typ danych int. Ten kod znajduje się w procedurze składowanej
 – 
ILoveStackoverflow
26 styczeń 2022, 21:25
1
Czy możesz pokazać rzeczywisty kod, którego używasz, ponieważ kod w Twoim pytaniu nie kompiluje się dla mnie. Jeśli nadal próbujesz użyć return, nigdy nie będziesz w stanie return ciągu z procedury składowanej. CONCAT ignoruje typy, więc powinien pozwolić ci zbudować ciąg bez zajmowania się błędami konwersji. Przykład. Ale będziesz musiał użyć parametru SELECT lub OUTPUT, ponieważ procedura składowana nie może return wartości takiej jak 5.1.10.
 – 
Aaron Bertrand
26 styczeń 2022, 21:25
To jest rzeczywisty kod, który zamieściłem w pytaniu. Jaki błąd otrzymujesz? Jakie jest rozwiązanie zwracania danych wyjściowych jako „1.10”? Nie ma na to rozwiązania?
 – 
ILoveStackoverflow
26 styczeń 2022, 21:33
Jaka jest definicja procedury składowanej, której używasz i jak wykonujesz procedurę składowaną, czy możesz to opisać?
 – 
magnus
26 styczeń 2022, 21:34

2 odpowiedzi

Wystarczy rozwinąć komentarz Aarona

Musisz zachować spójność typu danych. W tym przypadku stringi.

select 
    (CASE
          WHEN @isAuditDone = 1
                THEN concat(E.Id,'.',@Version)
          WHEN @isAuditDone = 0
                THEN concat('',E.Id)  -- Notice INT to string 
          ELSE 
                concat('',E.Id)       -- Notice INT to string 
          END) AS Id, 
          EmployeeId
    from 
    EmployeeAudit E
2
John Cappelletti 26 styczeń 2022, 21:31
Poparłem za wasze życzliwe starania, aby mi pomóc. Spróbuję tego. Ponadto, czy możliwe jest zwrócenie go jako 1,10 jako dziesiętny lub zmiennoprzecinkowy, jeśli isAuditDone = 1 w przeciwnym razie zwróci int, jeśli isAuditDone = 0, jeśli mamy problem ze zwróceniem ciągu, jak wspomnieli inni?
 – 
ILoveStackoverflow
26 styczeń 2022, 21:51
Jasne, możesz owinąć CASE w convert(decimal(2), case ... ) jako ID
 – 
John Cappelletti
26 styczeń 2022, 21:54
Wniosek jest taki, że typ danych wyrażenia CASE musi być spójny... int, string, dziesiętny itp.
 – 
John Cappelletti
26 styczeń 2022, 22:00

Jeśli chcesz zwrócić coś innego niż wartość całkowitą z procedury składowanej, musisz użyć kolumny Output. Więc w twoim przypadku musisz zwrócić String, ponieważ masz kropkę, do której należy dołączyć numer. Jest to demonstracyjna definicja procedury składowanej, której możesz użyć, aby spełnić swoje oczekiwania.

CREATE PROCEDURE  SProc
@Id varchar(500) OUTPUT
AS 
select 
    (CASE
          WHEN @isAuditDone = 1
                THEN concat(E.Id,'.',@Version)
          WHEN @isAuditDone = 0
                THEN concat('',E.Id)   
          ELSE 
                concat('',E.Id)       
          END) AS Id, 
          EmployeeId
    from 
    EmployeeAudit E

Następnie możesz wykonać swój przechowywany proces w ten sposób z parametrem wyjściowym.

Declare @Id varchar(500)
EXEC SProc  @Id  OUTPUT
1
magnus 26 styczeń 2022, 21:48
Dziękuję bardzo za odpowiedź, ale zobacz moją aktualizację. Popieram jednak twoje życzliwe starania, aby mi pomóc
 – 
ILoveStackoverflow
26 styczeń 2022, 21:50