在存储过程中执行时返回不正确的语法

时间:2017-06-23 01:48:37

标签: sql stored-procedures

我仍然是商店程序的新手。

有人可以帮忙告诉我这有什么问题吗?

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'附近的语法不正确。'

2 个答案:

答案 0 :(得分:2)

您不能只在您正在编写的查询中混合参数。

您需要使用动态SQL来执行此操作,这样您就可以将整个查询构建为字符串。

像:

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

但是,您不能在该动态查询上声明游标,因此一种方法是将该执行的结果插入临时表,然后在该表上构建游标。

如果你可以通过接收在常规查询中使用的参数来完全避免动态SQL,那就更好了,因为动态SQL可能更难调试,而且如果你从前端收到这个,你可以接触到SQL注入攻击。

答案 1 :(得分:0)

您必须先DECLARE变量

DECLARE @whereClause nvarchar(max)

此外,这看起来不正确:select id,itemNo,tstations_id,datetimestamp from tProduction_Count @whereClause

whereClause变量在这里做什么?