Ausführen mehrerer Anweisungen und CTE in der gespeicherten Prozedur in SQL Server 2012?
Ich bin newish zu SQL server 2012, und ich bin versucht, eine gespeicherte Prozedur erstellen, sollten:
- Löschen von vorhergehenden Daten aus einer Tabelle, basierend auf einem parameter, dann
- Einfügen neuer Daten in der Tabelle.
Aber ich muss an CTEs aus performance-Gründen (bitte don ' T get hung up auf, dass, ich habe, nur auf mein Wort).
Die CTE-Abfrage funktioniert gut, wenn es von selbst in einer Gespeicherten Prozedur, aber ich kann nicht die SP die Arbeit mit zwei Klauseln.
Bekomme ich eine Fehlermeldung, wenn Sie versuchen, um die Prozedur zu erstellen, und beschwert sich, dass ich sollte, verwenden Sie ein Semikolon, bevor die CTE. Wenn ich die Semikolon, SQL Server beschwert sich über es auch. Es treibt mich in den Wahnsinn, bitte helfen!
Tabelle where I want to delete/insert:
CREATE MYTABLE ( APPUSER NVARCHAR(15), DATA NVARCHAR(100) )
Vereinfachte Prozedur (kein Semikolon):
CREATE PROCEDURE P1 ( @SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS
BEGIN
DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER )
WITH CTE AS (
SELECT DATA
FROM SOURCETABLE
WHERE ( TYPE = @TYPE )
)
INSERT INTO MYTABLE
SELECT
@SOMEUSER,
DATA
FROM CTE
END
Fehlermeldung ohne Semikolon:
[Error Code: 319, SQL
Status: S1000] Falsche syntax bei das Schlüsselwort 'mit'. Wenn diese
Anweisung ein allgemeiner Tabellenausdruck, der eine xmlnamespaces-Klausel oder eine
ändern tracking-Kontext-Klausel, die Vorherige Anweisung werden muss
mit einem Semikolon beendet.
Bitte beachten Sie, dass, obwohl, dass ist eine vereinfachte version der eigentlichen Abfrage, die Fehlermeldung ist genau die gleiche. Ich habe versucht den obigen code ohne Glück 🙁
Gespeicherte Prozedur mit Semikolon (gleiche Abfrage wie oben, zeigt nur das Semikolon für die Kürze):
(...)
BEGIN
DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER ); /* Semicolon */
WITH CTE AS (
(...)
Fehler mit dem Semikolon:
[Fehlercode: 102, SQL State: 42000] Falsche syntax in der Nähe von ')'.
Habe ich versucht die Einhausung der DELETE-Klausel in seine eigene Transaktion, das hat nicht funktioniert, bekomme immer einen der beiden Fehler.
Alle Hinweise werden sehr geschätzt, danke!!!
- Setzen Sie ein Semikolon vor
WITH
. Wie diese:;WITH
. - Beide sind eqivalent
- Ihre zweite Abfrage sieht gut aus. Wenn möglich poste den kompletten query
- Ach richtig. Nicht bemerkt, dass! sorry.
- Hi Jungs, danke. Ich habe versucht, wie diese:
CREATE PROCEDURE P1 ( @SOMEUSER NVARCHAR(15), @TYPE INTEGER) AS BEGIN DELETE FROM MYTABLE WHERE ( APPUSER=@SOMEUSER ) ;WITH CTE AS ( SELECT DATA FROM SOURCETABLE WHERE ( TYPE = @TYPE ) ) INSERT INTO MYTABLE SELECT @SOMEUSER, DATA FROM CTE END
gleichen Fehler, Falsche syntax in der Nähe von ')'. - Sollten Sie veröffentlichen Sie Ihre vollständige Abfrage. Die, die Sie gab, nicht zu einem Fehler auf meiner lokalen Maschine.
- eigentlich sollte man ein
;
nach jede Anweisung: sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/... - ja ich habe es verstanden. Allerdings, wie der OP darauf hingewiesen, dass Sie nicht, sein problem zu lösen. Vielleicht ist das problem, verursacht durch den anderen Teil seiner Frage, die wir nicht kennen.
- Ich denke, Sie sollten sich für eine nicht übereinstimmende Klammer.
- befürworten der Benutzung von
;with
macht die Menschen denken, dass;with
ist ein einziges "keyword" und die Ergebnisse in Sachen wie diese: stackoverflow.com/questions/23078215/... - Ich Stimme völlig mit Ihnen. Ich habe lediglich vorgeschlagen, es für eine schnelle Lösung. Tut mir Leid für die Verwirrung.
- Was stümpfe mich ist, dass ich speichern Sie und führen Sie die gespeicherte Prozedur mit der CTE-Abfrage von selbst. Wenn ich eine andere Anweisung, selbst ein einfaches SELECT * das ist, wenn SQL Server beschwert sich über das Semikolon. Ich glaube nicht, dass die Abfrage das problem, vielleicht gibt es eine Einstellung, ich bin mir nicht bewusst, die einen Konflikt verursacht?
- ignorieren Sie meine vorherigen Vorschlag.
;
ist ein terminator, nicht ein "beginator", so muss das sein, setzen Sie nach jede Aussage eher als vorher. - wenn Sie beenden Sie alle Anweisungen vor der
CTE
mit einem Semikolon, der SP sollte nicht die Fehler aus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie etwas seltsames vor sich ging, da die folgenden arbeiten für mich:
Überprüfen Sie Ihre Umgebung
CTE ist nur syntax - es hilft nicht, die Leistung
Müssen Sie eine ';' vor 'Mit' - Schlüsselwort, wird Ihr code wie folgt Aussehen
Als Daumenregel für CTE, immer mit einem Semikolon beginnen, wenn Sie irgendwelche ausführbaren Anweisung oben Ihre CTE.
Für eine vollständige Klarheit der Punkte, die von anderen, ist dieser Auszug aus die MSDN-Dokumentation von CTE in SQL Server ist ein wesentlicher Hinweis für die Nutzung des CTE ist:
Als auch angemerkt, ist es am besten Praxis, um entweder:
Ich bevorzuge die erste, aber ich habe gesehen, kompetente Entwickler, die lieber die zweite.