Piszę procedurę przechowywaną i chcę zwrócić 0 rekordów, gdy coś się nie powiedzie. Nie mogę wymyślić, jak po prostu zwrócić 0 wierszy? Użyłem SELECT NULL
, ale to zwraca 1 wiersz z NULL
w wierszu 1 kolumnie 1. Próbowałem również nie określając żadnych instrukcji SELECT
w mojej ścieżce kodu błędu, ale podczas testowania wartości @@ROWCOUNT
po wywołaniu do SP, zwrócił 1 Myślę, że może tak być dlatego, że @@ROWCOUNT
nigdy nie został zresetowany z wcześniejszego oświadczenia w SP (w EXISTS()
). Każda rada byłaby doceniona.T-SQL: Jak zwrócić 0 wierszy z procedury przechowywanej i jak używać XACT_ABORT i TRY/CATCH
Mam również XACT_ABORT
ustawiony na WŁĄCZONY, ale użyłem również bloku TRY/CATCH
, aby upewnić się, że zwracam poprawny błąd "zwracaną wartość" z procedury przechowywanej. Czy to w porządku? Jeśli wystąpi błąd, czy XACT_ABORT
zastąpi TRY/CATCH
lub czy ścieżka mojego kodu błędu nadal będzie prowadzić do zwracania poprawnych wartości zwracanych?
-- Setup
SET NOCOUNT ON; -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET XACT_ABORT ON; -- SET XACT_ABORT ON rollback transactions on errors
DECLARE @return int; SET @return = 1; -- Default to general error
-- Start transaction
BEGIN TRANSACTION
BEGIN TRY
IF NOT EXISTS(SELECT NULL FROM [MyTable] WHERE [Check] = 1)
BEGIN
-- Insert new record
INSERT INTO [MyTable] (Check, Date) VALUES (1, GETDATE());
SELECT SCOPE_IDENTITY() AS [MyValue]; -- Return 1 row
SET @return = 0; -- Success
END
ELSE
BEGIN
-- Fail
SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL
SET @return = 2; -- Fail error
END
END TRY
BEGIN CATCH
-- Error
ROLLBACK TRANSACTION;
SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL
SET @return = 1; -- General error
END CATCH
-- End transaction and return
COMMIT TRANSACTION
RETURN @return;
Dzięki za szybką odpowiedź! Z tego powodu otrzymuję zerowy wynik :) Ale jakikolwiek pomysł, dlaczego po "EXEC MySP" dlaczego '@@ ROWCOUNT' = 1? –
'EXEC @ret = MySP; SET @rows = @@ ROWCOUNT; WYBIERZ "Wiersze" = @ wiersze' zwraca 1, a następnie liczba wierszy !? –
Ach, mam rację, myśląc, że '@@ ROWCOUNT' jest zmieniany tylko w przypadku instrukcji dotyczących wierszy (np.' INSERT' lub 'UPDATE')? –