2017-06-23 5 views
0

私はストアプロシージャでまだ新しいです。ストアプロシージャで実行すると構文が正しく返されません

誰も助けて、これに間違っていると教えてください。

Create PROCEDURE [dbo].[spCreateProductionReport] 

@whereClause nvarchar(max) 

As 
Begin 
    declare @id int, @itemNum nvarchar(20), @datetimestamp datetime, @tStations_id int 
    declare @counter int, @itemNumPrev nvarchar(20) 
    set @counter = 0 
    set @itemNumPrev ='' 
    set @whereClause = '' 
    SET NOCOUNT ON; 
    create table #Temp 
    (
    id int, 
    itemNum nvarchar(20), 
     tStations_id int, 
     datetimestamp datetime, 
     groupID int 



    ) 


    DECLARE db_cursor CURSOR FOR 

    select id,itemNo,tstations_id,datetimestamp 
    from 
    tProduction_Count @whereClause 
    --where datetimestamp between '2017-03-16 00:00:00' and '2017-03-16 23:59:59' 
    ORDER BY id ASC 

    OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @id, @itemNum,@tStations_id, @datetimestamp 

私が得たエラーは次のとおりです。 'メッセージ102、レベル15、状態1、プロシージャspCreateProductionReport、ライン42 付近に正しくない構文 '@whereClause'。'

+0

@whereClause変数はパラメータですか、それとも '宣言するのを忘れましたか? – Norsk

+0

それはパラメータでなければなりません、私はフロントエンドから文字列/テキストを取得するためにwhereClauseを使用し、ここでフィルタとして使用します – MichaelJ

答えて

0

あなたはDECLAREに持っている変数最初また

DECLARE @whereClause nvarchar(max)

、これは右見ていない:select id,itemNo,tstations_id,datetimestamp from tProduction_Count @whereClause

がここでやっwhereClause変数とは何ですか?

+0

AS開始前に@whereClauseを宣言しました – MichaelJ

+0

どこの行42 。編集を参照して、別のポイントを追加しました – Norsk

+0

whereClauseをフィルタとして使用したいと思います。これはフロントエンドから取得して渡します。もっと良い方法がありますか? – MichaelJ

2

書き込み中のクエリにパラメータを混ぜることはできません。

これを実行するには動的SQLを使用する必要があります。そうすることで、クエリ全体を文字列として作成することになります。

同様:

EXEC('select id,itemNo,tstations_id, datetimestamp from tProduction_Count ' + @whereClause) 

しかし、あなたはその動的問合せの上にカーソルを宣言することはできませんので、一つの方法は、一時テーブルにその実行結果を挿入し、そのテーブルの上にカーソルを構築することです。

通常のクエリで使用するパラメータを受け取ることによって動的SQLを完全に回避することができれば、動的SQLはデバッグが難しくなる可能性があります。フロントエンドからこれを受け取っている場合は、 SQLインジェクション攻撃。

関連する問題