2017-08-09 8 views
0

特定の人の預金レコード、その人の預金の数、およびその人の預金の行番号を返すストアドプロシージャを作成しようとしています。パラメータ@personIDには、常に正しいpersonIDが指定されています。 @SpecificRowは0(最も最近の預金を返す)または行番号(意味:この特定の行のレコードを返す)です。SQL Serverストアドプロシージャ構文エラー

スクリプト:私はALTERステートメントを実行してみた場合

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 

、私は次のエラーを取得する:

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

任意の洞察力?

ありがとうございました。

+1

チェックに合格したもの#TempSortedDeposits FROM SELECT *のですか? –

+1

@FullMoonFisherこれはコンパイル時にエラーを起こすべきではなく、実行するだけです。 – scsimon

答えて

1

私はこの行SELECT * FROM #TempSortedDeposits WHERE RecordNo = @RowNumberを削除し、手動で再入力して機能しました。

これは、コピーと貼り付けによってエラーが発生したためです。コードを貼り付けた結果は、非制動スペースのような印刷不可能な文字のが含まれています。

+0

ありがとうございます。どのようにしてその線が問題であると特定しましたか?このため、エラーの – ti034

+1

あなたはPROC名からスキーマを削除しました。 –

1

あなたの#TempSortedDepositsあなたがそうだと思うようにあなたの#TempSortedDepositsちょうどメモ...あなたのテーブルは落ちています。ここで

は簡単な例です:

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

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

あなたはこのを最初に実行するとするとき、それはいけない、それが削除されているはずなので、それは、1を返します。

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

:に構文を変更し、

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

この問題を解決するには:セカンドラン(同じ接続)上では、テーブルがまだ存在するとドロップされなかったことを示し、このエラーメッセージが表示されますここでは、テスト

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

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

であるあなたは(私たちは最後の実行でそれを作成したので)最初に手動でテーブルをドロップして、これを実行する場合は、エラーメッセージが表示されます:

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

これは、選択が失敗したことを意味し、表が実際に削除されたことを示します。

-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

『近く「『』付近に正しくない構文が。ほとんど常に後にプリントアウト何として印刷できない文字によって呼び出される』とそのはそれを修正することになったのか? – scsimon

1

私は下の行にある余分な文字を削除し、このprocを再実行しました。ラインのparam @personIDにRecordNo = @RowNumber

関連する問題