TSQL - erstellen Sie eine gespeicherte Prozedur innerhalb einer Transaktion-Anweisung
Habe ich ein sql-Skript, das set roll-Produktion. Ich umwickelt habe die verschiedenen Projekte, die in separaten Transaktionen. In jedem der Geschäfte, die wir erstellten gespeicherten Prozeduren. Ich bin immer Fehlermeldungen
Msg 156, Level 15, State 1, Line 4
Falsche syntax bei das Schlüsselwort 'return'.
Habe ich das Beispiel-Skript zur Veranschaulichung
Begin Try
Begin Transaction
-- do a bunch of add/alter tables here
-- do a bunch of data manipulation/population here
-- create a stored proc
create procedure dbo.test
as
begin
select * from some_table
end
Commit
End Try
Begin Catch
Rollback
Declare @Msg nvarchar(max)
Select @Msg=Error_Message();
RaisError('Error Occured: %s', 20, 101,@Msg) With Log;
End Catch
Der Fehler scheint zu implizieren, dass kann ich nicht erstellen gespeicherte Prozeduren innerhalb der Transaktion, aber ich bin nicht auf der Suche nach einem docs, die etwas anderes sagen(vielleicht google nicht freindly heute).
ist das für sql-server?
ja, sorry, ich sollte erwähnt haben, dass. sql 2008.
Ich beschloss, ziehen Sie die create proc aus der Transaktion & try/catch-in einen eigenen Abschnitt. Habe ich in eine "wenn vorhanden, dann drop" - Anweisung und fügte hinzu, "wenn es existiert, dann drucken Nachricht" - Statements(s) um die gespeicherte Prozedur Schöpfung. Danke für das feedback, ich lernte etwas von ihm.
ja, sorry, ich sollte erwähnt haben, dass. sql 2008.
Ich beschloss, ziehen Sie die create proc aus der Transaktion & try/catch-in einen eigenen Abschnitt. Habe ich in eine "wenn vorhanden, dann drop" - Anweisung und fügte hinzu, "wenn es existiert, dann drucken Nachricht" - Statements(s) um die gespeicherte Prozedur Schöpfung. Danke für das feedback, ich lernte etwas von ihm.
InformationsquelleAutor Chris L | 2010-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen dabei die
create procedure
imEXEC('...')
wie diese:create procedure...
Aufruf muss die erste Anweisung im Skript. Legt es in seinen eigenen Stapel mitEXEC
löst dieses. Dies kann auch verwendet werden, um Skript-Dateien, die entweder erstellen oder aktualisieren einer gespeicherten Prozedur. Sehr nützlich für die Prozedur script-Archivierung.In der Probe, wenn man es direkt(in einem echten Tabellennamen für some_table) mit der ddl/dml-Sachen auskommentiert der Fehler passiert immer noch, und noch die create-Prozedur, ist die erste Aussage, oder bin ich Missverständnis.
der code läuft bei mir gut, ich bin mir nicht sicher, was Sie ändern
KM, Sie wissen über die Probleme, die user1035920 wies darauf hin, unten?
Sie konnte immer Folgen Sie Ihrer EXEC() mit einem Scheck von der Systemtabellen, um zu sehen, ob die Prozedur vorhanden ist und wenn nicht, geben Sie eine RAISERROR (), um in den Herbst zu FANGEN und zurücksetzen.
InformationsquelleAutor KM.
Sie können schreiben Ihr Skript in dieser Weise, da es viele Anweisungen, die ausgeführt werden müssen, in Ihre eigene Gruppe. Stattdessen würde ich empfehlen, etwas zu tun, ähnlich wie Red-Gate ' s SQL Vergleichen, baut seine Skripte:
Error
ist nicht eine Spalte in#tmpErrors (Error) Select 1
sollte es seinID
(oderCreate Table #tmpErrors( Id int not null )
sollteCreate Table #tmpErrors( Error int not null )
?Ja. Das ist ein Tippfehler meinerseits, den ich korrigiert. Wenn Sie gehen mit
Id
, dann die Create Table Anweisung sollte natürlich verwendenId
. Wenn Sie gehen mitError
, dann die Create Table-Anweisung aktualisiert werden muss für diese Tatsache.Vielen Dank für die Klarstellung. +1 von mir. Tolle Antwort.
dies ist eine AUSGEZEICHNETE Antwort, ja ich danke Ihnen sehr. wo hast du das gelernt?
Wie bereits in meinem post, das ist, wie Red-Gate ' s SQL Vergleichen Sie in Skripten seine Daten ändert.
InformationsquelleAutor Thomas
Gibt es verschiedene Probleme mit der vorgeschlagenen Lösung von KM:
Wenn der Inhalt von dem, was man in den EXEC () - Aufruf ist falsch, semantisch (zum Beispiel legst du eine nicht-existierende Tabelle in der FROM-innerhalb der gespeicherten Prozedur), dass Fehler nicht sprudeln, und die Transaktion wird nicht zurückgerollt.
Wenn der Inhalt von dem, was man in den EXEC () - Aufruf ist syntaktisch falsch (zum Beispiel legst du SELECTT anstatt WÄHLEN Sie innerhalb der gespeicherten Prozedur), wird die Transaktion scheint ein Rollback ausgeführt werden, aber eine völlig kryptische Fehlermeldung Blasen bis:
So, ich bin immer noch ratlos zu, wie erstellen Sie eine Prozedur innerhalb einer Transaktion, aber immer noch die Transaktion und die try-catch nützlich sein.
InformationsquelleAutor
Ich scheine zu erinnern, Sie kann nicht Dinge tun, wie erstellen, ändern oder löschen Datenbank-schema-Objekte—einschließlich gespeicherter Prozeduren—innerhalb einer Transaktion (da solche strukturellen Veränderungen sind nicht transaktional: Sie können nicht Rollen Sie zurück, mit änderungen der Daten).
Dies könnte sich geändert haben in neueren Versionen von SQL Server natürlich.
InformationsquelleAutor Richard