存储过程中的临时表存在疑问 [英] Temporary table in stored procedure doubt

查看:75
本文介绍了存储过程中的临时表存在疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

- 场景

1)存储过程接受4个参数

2)第四个参数可以是'P'或'D'



- 如果它是'P'则会累积然后我插入临时表

- 如果它是'D'则累积然后我插入临时表



3)我在if和else中做第二部分...但是在这里我得到错误..

如果我删除其他部分,然后它的工作原理..



但如何将其他部分包含在临时表中



存储过程从以下开始



--------------------------- -------------------------------------------------- ---------





ALTER PROCEDURE SINGLEROUTE-- 574,'8/09/2013 00:00' ,'8 / 09/2013 23:59','P'





@HUBID INT,

@FROMDATE DATETIME,

@TODATE DATETIME,

@TYPE varchar(10)



< b r />
AS



BEGIN

设定NOCOUNT ON

打印'类型:'+ CAST(@TYPE AS VARCHAR(50))

PRINT'fromdate:'+ CAST(@FROMDATE AS VARCHAR(50))

打印'todate:'+ CAST( @FROMDATE AS VARCHAR(50))



DECLARE @USERID VARCHAR(50),

@APDDATE DATETIME,

@REQUESTID INT,

@From_Facility_ID INT,

@FROM_ADDRESS INT,

@TO_ADDRESS INT,

@TO_FACILITY_ID INT,

@HUB_ID INT,

@NEW_ROUTEID INT,

@NEW_STOPID INT,

@NEW_STOPIDF INT,

@Username varchar(50)



IF(@ TYPE ='P')

BEGIN

选择*

INTO#SINGLEREQUEST3

来自tbl_Request

其中To_Facility_ID in(从tbl_Facility中选择facility_id,其中Hub_ID = @HUBID)

和@FROMDATE和@TODATE之间的Appointment_DateTime以及(1)中的Request_Status_ID AND Created_By =路线副本'

结束



ELSE

BEGIN

select *

INTO#SINGLEREQUEST3

来自tbl_Request

其中FROM_Facility_ID in(选择来自tbl_Facility的facility_id,其中Hub_ID = @ HUBID)

和@FROMDATE和@TODATE之间的约会_时间和(1)中的Request_Status_ID AND Created_By ='路线副本'

结束

从#SINGLEREQUEST3中选择*



开始尝试

BEGIN TRANSACTION



DECLARE CUR_MOVE CURSOR SCROLL



--- sp继续



- 如果我执行

执行SINGLEROUTE 574,'8/09 / 2013 00:00','8/09/2013 23:59','P'





我得到的错误



Msg 2714,Level 16,State 1,Procedure SINGLEROUTE,Line 48

已经有一个名为'#SINGLEREQUEST3'的对象了数据库。

消息156,等级15,状态1,程序SINGLEROUTE,第50行

关键字'和'附近的语法不正确。

--scenario
1) the stored procedure accepts 4 parameters
2) the fourth paraemeter can be 'P' or 'D'

--so accroding if it is 'P' then i m inserting into temporary table
--so accroding if it is 'D' then i m inserting into temporary table

3)i am doing the second part in if and else ...but here where i am getting error..
if i remove that else part then it works..

but how to include that else part in temporary table

Stored procedure starts as per below

--------------------------------------------------------------------------------------


ALTER PROCEDURE SINGLEROUTE-- 574,'8/09/2013 00:00','8/09/2013 23:59','P'
(

@HUBID INT,
@FROMDATE DATETIME,
@TODATE DATETIME,
@TYPE varchar(10)
)

AS

BEGIN
SET NOCOUNT ON
PRINT 'TYPE:' + CAST(@TYPE AS VARCHAR(50))
PRINT 'fromdate:' + CAST(@FROMDATE AS VARCHAR(50))
PRINT 'todate:' + CAST(@FROMDATE AS VARCHAR(50))

DECLARE @USERID VARCHAR(50),
@APPDATE DATETIME,
@REQUESTID INT,
@From_Facility_ID INT,
@FROM_ADDRESS INT,
@TO_ADDRESS INT,
@TO_FACILITY_ID INT,
@HUB_ID INT,
@NEW_ROUTEID INT,
@NEW_STOPID INT,
@NEW_STOPIDF INT,
@Username varchar(50)

IF (@TYPE='P')
BEGIN
select *
INTO #SINGLEREQUEST3
from tbl_Request
where To_Facility_ID in(select facility_id from tbl_Facility where Hub_ID=@HUBID)
and Appointment_DateTime between @FROMDATE and @TODATE and Request_Status_ID in(1) AND Created_By='Route Replica'
END

ELSE
BEGIN
select *
INTO #SINGLEREQUEST3
from tbl_Request
where FROM_Facility_ID in(select facility_id from tbl_Facility where Hub_ID=@HUBID)
and Appointment_DateTime between @FROMDATE and @TODATE and Request_Status_ID in (1) AND Created_By='Route Replica'
END
select * from #SINGLEREQUEST3

BEGIN TRY
BEGIN TRANSACTION

DECLARE CUR_MOVE CURSOR SCROLL FOR

---the sp continues

--if i execute
execute SINGLEROUTE 574,'8/09/2013 00:00','8/09/2013 23:59','P'


the error that i get

Msg 2714, Level 16, State 1, Procedure SINGLEROUTE, Line 48
There is already an object named '#SINGLEREQUEST3' in the database.
Msg 156, Level 15, State 1, Procedure SINGLEROUTE, Line 50
Incorrect syntax near the keyword 'and'.

推荐答案





当你在查询中使用临时表时,在编译期间会假定表中存在名称,所以你必须在else部分使用其他名称,i现在已经改变了你的查询它会起作用。





改变程序SINGLEROUTE-- 574,'8/09/2013 00:00' ,'8 / 09/2013 23:59','P'





@HUBID INT,

@FROMDATE DATETIME,

@TODATE DATETIME,

@TYPE varchar(10)





AS



BEGIN

设定NOCOUNT ON

打印'类型:'+ CAST(@TYPE AS VARCHAR(50))

PRINT'fromdate:'+ CAST(@FROMDATE AS VARCHAR(50))

打印'todate:'+ CAST( @FROMDATE AS VARCHAR(50))



DECLARE @USERID VARCHAR(50),

@APDDATE DATETIME,

@REQUESTID INT,

@From_Facility_ID INT,

@ FROM_ADDRESS INT,

@TO_ADDRESS INT,

@TO_FACILITY_ID INT,

@HUB_ID INT,

@NEW_ROUTEID INT ,

@NEW_STOPID INT,

@NEW_STOPIDF INT,

@Username varchar(50)



IF(@ TYPE ='P')

BEGIN

从tbl_Request中选择* INTO#SINGLEREQUEST3

其中To_Facility_ID in(选择来自tbl_Facility的facility_id,其中Hub_ID = @ HUBID)

和@FROMDATE和@TODATE之间的Appointment_DateTime以及(1)中的Request_Status_ID AND Created_By ='路由副本'

END



ELSE

BEGIN

从tbl_Request中选择* INTO#SINGLEREQUEST4其中FROM_Facility_ID(从tbl_Facility中选择facility_id,其中Hub_ID = @HOMID)和@FROMDATE和@TODATE之间的Appointment_DateTime以及(1)中的Request_Status_ID AND Created_By =路线副本'

结束



结束



- 选择*来自#SINGLEREQUEST3



- 开始尝试

- 开始交易



--DECLARE CUR_MOVE CURSOR SCROLL



--- sp继续



- 如果我执行

执行SINGLEROUTE 574,'8/09/2013 00:00','8/09/2013 23:59','P'





如果您有任何疑问,请告诉我..



问候,

Mubin
Hi ,

As you are using Temporary table in your query, when during compile time it will be presumed that table exists with the name , so you have to use other name in else part, i have changed your query now it will work.


alter PROCEDURE SINGLEROUTE-- 574,'8/09/2013 00:00','8/09/2013 23:59','P'
(

@HUBID INT,
@FROMDATE DATETIME,
@TODATE DATETIME,
@TYPE varchar(10)
)

AS

BEGIN
SET NOCOUNT ON
PRINT 'TYPE:' + CAST(@TYPE AS VARCHAR(50))
PRINT 'fromdate:' + CAST(@FROMDATE AS VARCHAR(50))
PRINT 'todate:' + CAST(@FROMDATE AS VARCHAR(50))

DECLARE @USERID VARCHAR(50),
@APPDATE DATETIME,
@REQUESTID INT,
@From_Facility_ID INT,
@FROM_ADDRESS INT,
@TO_ADDRESS INT,
@TO_FACILITY_ID INT,
@HUB_ID INT,
@NEW_ROUTEID INT,
@NEW_STOPID INT,
@NEW_STOPIDF INT,
@Username varchar(50)

IF (@TYPE='P')
BEGIN
select * INTO #SINGLEREQUEST3 from tbl_Request
where To_Facility_ID in(select facility_id from tbl_Facility where Hub_ID=@HUBID)
and Appointment_DateTime between @FROMDATE and @TODATE and Request_Status_ID in(1) AND Created_By='Route Replica'
END

ELSE
BEGIN
select * INTO #SINGLEREQUEST4 from tbl_Request where FROM_Facility_ID in(select facility_id from tbl_Facility where Hub_ID=@HUBID)and Appointment_DateTime between @FROMDATE and @TODATE and Request_Status_ID in (1) AND Created_By='Route Replica'
END

END

--select * from #SINGLEREQUEST3

-- BEGIN TRY
--BEGIN TRANSACTION

--DECLARE CUR_MOVE CURSOR SCROLL FOR

---the sp continues

--if i execute
execute SINGLEROUTE 574,'8/09/2013 00:00','8/09/2013 23:59','P'


let me know if you have any further query..

Regards,
Mubin


本文, http://www.informit .com / articles / article.aspx?p = 25288& seqNum = 4 [ ^ ],(有些)解释了您的错误原因。显然,即使代码尚未执行,并且由于IF,代码似乎应该是独占的,但这是不允许的。此外,请参阅Microsoft - http://support.microsoft.com/kb/295305#appliesto [< a href =http://support.microsoft.com/kb/295305#appliestotarget =_ blanktitle =New Window> ^ ]。

解决方法链接中提供。



Scott
This article, http://www.informit.com/articles/article.aspx?p=25288&seqNum=4[^], explains (somewhat ) the reason for your error. Apparently, even though the code hasn't been executed yet, and it seems like the code should be exclusive due to the IF, it's not allowed. Also, see here from Microsoft - http://support.microsoft.com/kb/295305#appliesto[^].
Work-arounds are provided in the links.

Scott


这篇关于存储过程中的临时表存在疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆