2017-08-09 1 views
0

Ich versuche, eine gespeicherte Prozedur zu schreiben, die einen Einzahlungsdatensatz für eine bestimmte Person, die Anzahl der Einzahlungen für diese Person und die Zeilennummer der Einzahlung für diese Person zurückgibt. Der Parameter @personID liefert immer die richtige personID; @SpecificRow ist jedoch entweder 0 (bedeutet: die letzte Einzahlung zurückgeben) oder eine Zeilennummer (bedeutet: Datensatz in dieser bestimmten Zeile zurückgeben).SQL Server Stored Procedure Syntaxfehler

Script:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [schema].[procedure] 
    @personID varchar(5), 
    @SpecificRow int, 
    @RowNumber INT OUTPUT, 
    @RowCount INT OUTPUT 
AS 
BEGIN 
    IF OBJECT_ID('#TempSortedDeposits') IS NOT NULL 
     DROP Table #TempSortedDeposits 

    -- get all deposits with record number into temp file for specific personID 
    SELECT 
     ROW_NUMBER() OVER (ORDER BY Date ASC) AS RecordNo, * 
    INTO 
     #TempSortedDeposits 
    FROM 
     persons.Deposits 
    WHERE 
     personID = @personID 

    -- get record count in file 
    SELECT @RowCount = COUNT(personID) 
    FROM persons.Deposits 
    WHERE personID = @personID 

    IF @SpecificRow = 0 --get most recent record 
     SET @RowNumber = @RowCount; 
    ELSE 
     --get record by rownumber 
     SET @RowNumber = @SpecificRow; 

    SELECT * 
    FROM #TempSortedDeposits 
    WHERE RecordNo = ­@RowNumber 
END 

Wenn ich die Anweisung alter versuchen laufen, bekomme ich folgende Fehlermeldung:

Msg 102, Level 15, State 1, Procedure procedure, Line 33 [Batch Start Line 9]
Incorrect syntax near '­'.

Einsicht?

Danke.

+1

prüfen, was an den Parameter @personID übergeben wurde? –

+1

@FullMoonFisher Dies sollte keinen Fehler bei der Kompilierung verursachen, nur Ausführung. – scsimon

Antwort

1

Ich löschte diese Zeile SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber und manuell erneut eingeben, dann funktionierte es.

Dies liegt daran, dass der Fehler aufgrund von Kopieren und Einfügen auftritt. Dieses Ergebnis zu eingefügt Code enthält nicht druckbare Zeichen wie d nicht bremsenden Leerzeichen.

+0

Danke. Wie haben Sie diese Linie als das Problem identifiziert? – ti034

+1

wegen dieses Fehlers "Falsche Syntax in der Nähe von ''. Wird fast immer von nicht druckbaren Zeichen aufgerufen, da nichts nach '' in der Nähe" ausgedruckt wird. –

1

Nur eine Randnotiz ... Ihre #TempSortedDeposits Tabelle fallen wie Sie denken, dass es ist.

Hier ist ein kurzes Beispiel:

create table #TempSortedDeposits (i int) 
insert into #TempSortedDeposits 
values 
(1) 

IF OBJECT_ID('#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits 
select * from #TempSortedDeposits 

Wenn Sie dies zum ersten Mal ausführen, wird es 1 zurück, wenn es nicht sollte, weil sie fallen gelassen werden sollte. Auf dem zweiten Lauf (gleiche Verbindung) erhalten Sie diese Fehlermeldung erhalten, Sie zeigen, dass die Tabelle noch vorhanden und wurde nicht gelöscht:

Msg 2714, Level 16, State 6, Line 2 There is already an object named '#TempSortedDeposits' in the database.

Um dies zu beheben, ändern Sie die Syntax:

IF OBJECT_ID('tempdb..#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits 

hier ist ein Test

create table #TempSortedDeposits (i int) 
insert into #TempSortedDeposits 
values 
(1) 

IF OBJECT_ID('tempdb..#TempSortedDeposits') IS NOT NULL DROP TABLE #TempSortedDeposits 
select * from #TempSortedDeposits 

Wenn Sie zuerst manuell auf den Tisch fallen lassen (da wir es mit dem letzten Lauf erstellt) und dann diese ausführen, werden Sie die Fehlermeldung erhalten:

Msg 208, Level 16, State 0, Line 7 Invalid object name '#TempSortedDeposits'.

Das bedeutet, dass die Auswahl fehlgeschlagen ist und somit angezeigt wird, dass die Tabelle tatsächlich gelöscht wurde.

-1
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
create PROCEDURE [procedure] 
    @personID varchar(5), 
    @SpecificRow int, 
    @RowNumber INT OUTPUT, 
    @RowCount INT OUTPUT 
AS 
BEGIN 
    IF OBJECT_ID('#TempSortedDeposits') IS NOT NULL 
     DROP Table #TempSortedDeposits 

    -- get all deposits with record number into temp file for specific personID 
    SELECT 
     ROW_NUMBER() OVER (ORDER BY Date ASC) AS RecordNo, * 
    INTO 
     #TempSortedDeposits 
    FROM 
     persons.Deposits 
    WHERE 
     personID = @personID 

    -- get record count in file 
    SELECT @RowCount = COUNT(personID) 
    FROM persons.Deposits 
    WHERE personID = @personID 

    IF @SpecificRow = 0 --get most recent record 
     SET @RowNumber = @RowCount; 
    ELSE 
     --get record by rownumber 
     SET @RowNumber = @SpecificRow; 
SELECT * 
    FROM #TempSortedDeposits 
    WHERE RecordNo = @RowNumber 
END 
--corrected the proc 
+1

Sie haben das Schema aus dem Namen des Prozesses entfernt und das sollte es beheben? – scsimon

1

Ich habe das zusätzliche Zeichen in der unteren Zeile entfernt und führen Sie diese Prozedur erneut aus. Zeile ist SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumber

Verwandte Themen