我仍然是商店程序的新手。
有人可以帮忙告诉我这有什么问题吗?
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 :(得分: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
变量在这里做什么?