Benutzer mit den meisten Antworten
Fehlerbehandlung in T-SQL

Frage
-
Hallo zusammen,
wie erstellt man in so einer SP eine ordentliche Fehlerbehandlung?
ALTER PROCEDURE [dbo].[InsertChildMastertblSoftware] -- Add the parameters for the stored procedure here @Anzahl varchar(3), @InventarNo varchar(10), @Hersteller int, @Produkt int, @Lizenzform int, @Menge int, @VPID int, @VertragID int, @Master int = 0, @Passiv int = 0 AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here WHILE (@Anzahl >=1) BEGIN INSERT INTO [dbo].[tblSoftware] ([fldInventarNo] ,[fldHersteller] ,[fldProdukt] ,[fldLizenzform] ,[fldMenge] ,[fldVPID] ,[fldVertragID] ,[fldMaster] ,[fldPassiv]) VALUES (@InventarNo + '_' + @Anzahl ,@Hersteller ,@Produkt ,@Lizenzform ,@Menge ,@VPID ,@VertragID ,@Master ,@Passiv ) SET @Anzahl = @Anzahl - 1; END END
fldInventarNo ist der PK der Tabelle. Aus Access heraus wird die SP aufgerufen, da durchlaufe ich die Fehlerauflistung und bekomme Fehler zurück gemeldet. Nur weiß ich nicht, wie ich in SPs und in dieser ganz speziell vernünftig Fehler behandle.
Vielen Dank schon im Voraus.
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren
Antworten
-
Hallo Winfried,
schau mal hier, da findest Du Infos zur Fehlerbehandlung in T-SQL:
https://msdn.microsoft.com/de-de/library/ms175976.aspx
http://www.insidesql.org/blogs/cmu/sql_server/fehlerbehandlung-im-t-sql
https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/
In deinem Fall wäre es aber wohl sinnvoll, eher mal über Transaktionen nachzudenken. Wenn ein INSERT fehlschlägt, sollen ja wahrscheinlich gar keine Daten eingetragen werden. Falls ja, schau mal hier:
https://msdn.microsoft.com/de-de/library/ms188929.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 17. März 2015 16:08
- Als Antwort markiert Winfried.Sonntag Donnerstag, 19. März 2015 17:28
-
Hallo Winfried,
das beste wäre, es so umzuschreiben, dass sie mit einer Anweisung auskommt, was dann so nur eine Fehlermeldung gibt:
INSERT INTO [dbo].[tblSoftware] ([fldInventarNo] ,[fldHersteller] ,[fldProdukt] ,[fldLizenzform] ,[fldMenge] ,[fldVPID] ,[fldVertragID] ,[fldMaster] ,[fldPassiv]) SELECT @InventarNo + '_' + CAST(v.number AS varchar(10)) ,@Hersteller ,@Produkt ,@Lizenzform ,@Menge ,@VPID ,@VertragID ,@Master ,@Passiv FROM master..spt_values AS v WHERE type = 'P' AND number BETWEEN 1 AND @Anzahl;
Dabei wird die Schleife durch eine Nummertabelle ersetzt - hier ersatzweise durch die spt_values, die bis zu 2048 Zeilen schafft. Man sollte sich jedoch eine eigene Tabelle anlegen, die groß genug für alle Zwecke ist, siehe What is the best way to create and populate a numbers table?
Ansonsten wirst Du die längeren Wege gehen müssen, die in Stefans Links aufgeführt sind.
Gruß Elmar
- Als Antwort markiert Winfried.Sonntag Donnerstag, 19. März 2015 17:29
Alle Antworten
-
Hallo Winfried,
schau mal hier, da findest Du Infos zur Fehlerbehandlung in T-SQL:
https://msdn.microsoft.com/de-de/library/ms175976.aspx
http://www.insidesql.org/blogs/cmu/sql_server/fehlerbehandlung-im-t-sql
https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/
In deinem Fall wäre es aber wohl sinnvoll, eher mal über Transaktionen nachzudenken. Wenn ein INSERT fehlschlägt, sollen ja wahrscheinlich gar keine Daten eingetragen werden. Falls ja, schau mal hier:
https://msdn.microsoft.com/de-de/library/ms188929.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 17. März 2015 16:08
- Als Antwort markiert Winfried.Sonntag Donnerstag, 19. März 2015 17:28
-
Hallo Winfried,
das beste wäre, es so umzuschreiben, dass sie mit einer Anweisung auskommt, was dann so nur eine Fehlermeldung gibt:
INSERT INTO [dbo].[tblSoftware] ([fldInventarNo] ,[fldHersteller] ,[fldProdukt] ,[fldLizenzform] ,[fldMenge] ,[fldVPID] ,[fldVertragID] ,[fldMaster] ,[fldPassiv]) SELECT @InventarNo + '_' + CAST(v.number AS varchar(10)) ,@Hersteller ,@Produkt ,@Lizenzform ,@Menge ,@VPID ,@VertragID ,@Master ,@Passiv FROM master..spt_values AS v WHERE type = 'P' AND number BETWEEN 1 AND @Anzahl;
Dabei wird die Schleife durch eine Nummertabelle ersetzt - hier ersatzweise durch die spt_values, die bis zu 2048 Zeilen schafft. Man sollte sich jedoch eine eigene Tabelle anlegen, die groß genug für alle Zwecke ist, siehe What is the best way to create and populate a numbers table?
Ansonsten wirst Du die längeren Wege gehen müssen, die in Stefans Links aufgeführt sind.
Gruß Elmar
- Als Antwort markiert Winfried.Sonntag Donnerstag, 19. März 2015 17:29
-
ALTER PROCEDURE [dbo].[InsertChildMastertblSoftware] -- Add the parameters for the stored procedure here @Anzahl varchar(3), ....... SET @Anzahl = @Anzahl - 1; END END
Hallo Winfried,
nur ein kleiner Hinweis, wenn Du eine Variable zum Rechnen brauchst, solltest Du besser auch einen numerischen Datentypen verwenden und nicht varchar; dadurch würde schon mal eine unnötige Fehlerquelle weg fallen.
Olaf Helper
[ Blog] [ Xing] [ MVP] -
Am 17.03.2015 schrieb Elmar Boye:
Hallo Elmar,INSERT INTO [dbo].[tblSoftware] ([fldInventarNo] ,[fldHersteller] ,[fldProdukt] ,[fldLizenzform] ,[fldMenge] ,[fldVPID] ,[fldVertragID] ,[fldMaster] ,[fldPassiv]) SELECT @InventarNo + '_' + CAST(v.number AS varchar(10)) ,@Hersteller ,@Produkt ,@Lizenzform ,@Menge ,@VPID ,@VertragID ,@Master ,@Passiv FROM master..spt_values AS v WHERE type = 'P' AND number BETWEEN 1 AND @Anzahl;
Dabei wird die Schleife durch eine Nummertabelle ersetzt - hier ersatzweise durch die spt_values, die bis zu 2048 Zeilen schafft. Man sollte sich jedoch eine eigene Tabelle anlegen, die groß genug für alle Zwecke ist, sieheWhat is the best way to create and populate a numbers table? <http://stackoverflow.com/questions/1393951/what-is-the-best-way-to-create-and-populate-a-numbers-table>
was es nicht alles gibt. Vielen Dank, das hat geholfen. ;)
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren -
Am 18.03.2015 schrieb Olaf Helper [MVP]:
Hallo Olaf,nur ein kleiner Hinweis, wenn Du eine Variable zum Rechnen brauchst, solltest Du besser auch einen numerischen Datentypen verwenden und nicht varchar; dadurch würde schon mal eine unnötige Fehlerquelle weg fallen.
Danke für den Hinweis, im Beispielcode war es noch nicht korrekt
umgesetzt. ;)
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren -
Am 17.03.2015 schrieb Stefan Falz [MVP]:
Hallo Stefan,schau mal hier, da findest Du Infos zur Fehlerbehandlung in T-SQL:
https://msdn.microsoft.com/de-de/library/ms175976.aspx
http://www.insidesql.org/blogs/cmu/sql_server/fehlerbehandlung-im-t-sql
https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/
In deinem Fall wäre es aber wohl sinnvoll, eher mal über Transaktionen nachzudenken. Wenn ein INSERT fehlschlägt, sollen ja wahrscheinlich gar keine Daten eingetragen werden. Falls ja, schau mal hier:
https://msdn.microsoft.com/de-de/library/ms188929.aspxDanke, Transaktionen ist das Mittel der Wahl. ;)
Servus
Winfried
Gruppenrichtlinien
HowTos zum WSUS Package Publisher
WSUS Package Publisher
HowTos zum Local Update Publisher
NNTP-Bridge für MS-Foren