2017-06-23 92 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注入攻击。

相关问题