Łukasz W.

Łukasz W. SQL/ETL/BI

Temat: zagadka

Witam
mam taką procedurę slq która pobiera dane z pliku .csv potem na podstawie nr który jest tam zawarty wyszukuje nr polisy i potem kursorem wywołuję następną procedurę która zamyka daną polisę, ale czasem osoba przesyłająca plik .csv poda zły numer polisy, i chciałbym zeby cursor sie (mam tu ustawione begin try end try, a jak wywali błąd to begin catch end catch) nie wywalał tylko żeby ten zły numer polisy wrzucił do tabeli tymczasowej a kursor niech sobie idzie dalej , oczywiscie wszystko jest w transakcji i jak jeden nr jest zły to cała transakcja jest cofana

BEGIN TRANSACTION AAAA
BEGIN TRY

DECLARE PolisaCursor CURSOR FOR
SELECT Ltrim(Rtrim(Nr_polisy))
,Data_zawarcia
,Data_rozwiazania
,IdTerminationReason
FROM polisy_rozwiazania
WHERE Nr_polisy IS NOT NULL

OPEN Cursor
FETCH NEXT FROM Cursor INTO
@PolicyNoFull,
@DateStart,
@DateClose,
@IdTerminationReason


WHILE @@FETCH_STATUS = 0
BEGIN
print @PolicyNoFull

SET @IdPolicy = (SELECT IdPolicy
FROM Policy
WHERE PolicyNoFull = @PolicyNoFull
)
UPDATE Policy
SET DateClose = @DateClose,
IdTerminationReason = @IdTerminationReason,
Active = 1
WHERE IdPolicy = @IdPolicy

print @IdPolicy


EXEC @ReturnValue = sp_ClosePolicy @IdPolicy

print @ReturnValue


FETCH NEXT FROM PolisaCursor INTO
@PolicyNoFull,
@DateStart,
@DateClose,
@IdTerminationReason


END --WHILE

CLOSE Cursor
DEALLOCATE Cursor

END TRY
BEGIN CATCH
print 'zły koniec'
ROLLBACK TRANSACTION AAAA
SET @err=1;
DECLARE @ErrMsg nvarchar(4000)=ERROR_MESSAGE()+char(13)+char(10)+'Nr polisy: '+CAST(@PolicyNoFull AS varchar);;
RAISERROR(@ErrMsg,11,1) WITH SETERROR;

END CATCH

IF(@err<>1)
BEGIN
print 'dobry koniec'
COMMIT TRANSACTION AAAA;
END
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: zagadka

Jak dla mnie to zakombinowałeś trochę. NIe potrzebujesz tematu robić iteracyjnie. Ja bym sobie csv wczytał do tymczasowej tabeli i przed wykonaniem aktualizacji sprawdziłbym sobie select csv left join polisy on csv.numer = polisy.numer where polisy.id is null. Jak znajdzie rekordy z csv bez przyporządkowanej polisy to zwracam błąd i mam dokładnie które wiersze ... ergo nie wykonuję żadnej aktualizacji.
Jak wszystkie wiersze z csv mają dopasowaną polisę to robię sobie update tabela set ... join where.

1. Wczytujesz csv
2. Select ze sprawdzeniem po numerach polis
3. Update aktualizujący lub zwracam błąd wraz z listą błędnych wpisów z csv

Temat: zagadka

Wykonałabym to w dwóch krokach:
1) do tabeli tymczasowej (np. poprawnePolisy) wczytałabym wszystkie nr polis z pliku CSV


CREATE TABLE poprawnePolisy(
nr polisy varchar(20)
,poprawna int default 0
)


Następnie za pomocą exists sprawdziła czy nr polisy występuje w bazie. Jeśli tak to update ustawiając np wartość 1 w polu poprawna.

2) w transakcji można wówczas odwoływać się już tylko do poprawnych nr polis (where poprwna = 1)

Następna dyskusja:

[MS SQL] Zagadka - czemu se...




Wyślij zaproszenie do