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:

  1. Löschen von vorhergehenden Daten aus einer Tabelle, basierend auf einem parameter, dann
  2. 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.

Schreibe einen Kommentar