存储过程创建临时表的读取

chenhaoying 2010-09-25 04:08:58
使用存储过程创建临时表#tb,往里面插入数据。程序拼接个sql语句作为存储过程的参数传值过去。在存储过程中使用
exec(@sql);其中@sql="select * from #tb"执行出错(找不到对象#tb)。这个该怎么处理,主要是@sql这个sql语句需要按程序的规则生成的,只能拼接的。该怎么处理呢。
...全文
221 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhaoying 2010-09-27
  • 打赏
  • 举报
回复
真是晕,是sql写错了。那样执行没问题的。多谢大家回复,参与者加分。
hovy_yang 2010-09-25
  • 打赏
  • 举报
回复
先创建一个零时表#t,再exec(@sql)
chenhaoying 2010-09-25
  • 打赏
  • 举报
回复
现在是想把sql作为参数传过去使用exec执行的。可是是临时表的话就找不到对象了。高手帮忙
狼王_ 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenhaoying 的回复:]
CREATE PROCEDURE SelectRoomPrice
@CusID int ,
@BeginDate datetime ,
@ndays int,
@RoomType varchar(50),
@Sql varchar(2000)
AS

SET NOCOUNT ON


DECLARE @Length INT
DECLARE @Pr……
[/Quote]
你没有给@sql赋值,@sql还是空啊。你想让exec (@sql)显示什么结果啊?
fengyun142415 2010-09-25
  • 打赏
  • 举报
回复
先创建再使用表
王向飞 2010-09-25
  • 打赏
  • 举报
回复

--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:[TB]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[TB]')
AND type in (N'U'))
DROP TABLE [TB]
GO

---->建表
create table [TB]([a] int,[b] int,[c] varchar(6))
insert [TB]
select 1,13,'诸葛亮' union all
select 2,8,'曹操' union all
select 3,16,'刘备' union all
select 4,9,'孙权' union all
select 5,13,'司马懿' union all
select 6,9,'关羽' union all
select 7,2,'张非'
GO

if object_id('tempdb.dbo.#TempRoomPriceTable') is not null
drop table tempdb.dbo.#TempRoomPriceTable
SELECT * into #TempRoomPriceTable FROM [TB];
exec ('select * from tempdb.dbo.#TempRoomPriceTable')


--> 查询结果
SELECT * FROM [TB]
--> 删除表格
--DROP TABLE [TB]

ws_hgo 2010-09-25
  • 打赏
  • 举报
回复
思路
先判断有没有该临时表么有的话就创建,有的话不做任何操作


当存储过程执行完毕会
自动删除临时表的
chenhaoying 2010-09-25
  • 打赏
  • 举报
回复
CREATE PROCEDURE SelectRoomPrice
@CusID int ,
@BeginDate datetime ,
@ndays int,
@RoomType varchar(50),
@Sql varchar(2000)
AS

SET NOCOUNT ON


DECLARE @Length INT
DECLARE @PriceDate DateTime

SELECT @Length = @ndays
SELECT @PriceDate = @BeginDate

Create Table #TempRoomPriceTable
(
CusID int,
PriceDate datetime,
RoomType varchar(50) COLLATE Chinese_PRC_CI_AS NULL ,
Price money,

)

WHILE @Length > 0
BEGIN

IF @Length > 0
BEGIN

DECLARE @Price money

DECLARE @wd int

select @wd=datepart(weekday,@PriceDate)

if @wd>5
begin
select @Price= isnull((select top 1 SKWeekPrice from [表1] P join [表1]Date D on P.roomPriceID=D.roomPriceID Where P.CusId=@CusID and P.RoomType=@RoomType and @PriceDate between D.beginDate and D.endDate order by D.RPDateID desc),0)
end
else
begin
select @Price= isnull((select top 1 SKsalePrice from [表1] P join [表1]Date D on P.roomPriceID=D.roomPriceID Where P.CusId=@CusID and P.RoomType=@RoomType and @PriceDate between D.beginDate and D.endDate order by D.RPDateID desc),0)
end

insert into #TempRoomPriceTable (CusID,PriceDate,RoomType,Price)
select @CusID,@PriceDate,@RoomType,@Price

----日期递增
set @Length = @Length-1
SELECT @PriceDate = DATEADD (day,1, @PriceDate )


END
END

SET NOCOUNT OFF

--select * from #TempRoomPriceTable
exec(@Sql)
drop table #TempRoomPriceTable
GO

以上就是存储过程,直接执行select * from #TempRoomPriceTable是没问题的,可是作为参数传过去使用
exec(@Sql)执行就找不到对象了。
dawugui 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenhaoying 的回复:]
使用存储过程创建临时表#tb,往里面插入数据。程序拼接个sql语句作为存储过程的参数传值过去。在存储过程中使用
exec(@sql);其中@sql="select * from #tb"执行出错(找不到对象#tb)。这个该怎么处理,主要是@sql这个sql语句需要按程序的规则生成的,只能拼接的。该怎么处理呢。
[/Quote]
临时表只在当前会话中起作用。
所以建议你不要用临时表,而用正式表,用完后删除。
当然在创建之前也可以先判断该表是否存在,如果存在,则删除后再创建。
ws_hgo 2010-09-25
  • 打赏
  • 举报
回复
现创建#b
if object_id('#b') is not null drop table #b
bancxc 2010-09-25
  • 打赏
  • 举报
回复
先创建临时表。
王向飞 2010-09-25
  • 打赏
  • 举报
回复
你其他的脚本呢?看看你其他脚本怎么写的?
noteasytoregister 2010-09-25
  • 打赏
  • 举报
回复
先创建临时表。

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧