在存储过程中动态创建表遇到的问题

killStar 2004-03-27 10:33:49
基本过程如下:要求是不能改变临时表#TmpTab的名称,实现如下语句的功能,当然现在可以编译通过,但执行时会报错"对象名 '#TmpTab' 无效"
以及"无法 除去 表 '#TmpTab',因为它在系统目录中不存在。"
CREATE PROCEDURE AAA @iYear Smallint As

If @iYear<2000
Exec('CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))')
Else
Exec('CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))')

Exec('INSERT INTO #TmpTab values(0,0,0)')
Exec('Drop Table #TmpTab')
GO
...全文
69 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
killStar 2004-03-30
  • 打赏
  • 举报
回复
写进同一字符串再用exec执行是可以,但我这里是简化了,其实后面还有相当多的针对该临时表的操作且该表实际字段有70多个,所以写进同一执行语句里恐怕是不行的。
smalldeer 2004-03-29
  • 打赏
  • 举报
回复
不好意思
试了一下,大力的有点问题,

可以写在一个exec里

create PROCEDURE AAA @iYear Smallint As

If @iYear<2000
exec('CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30) )INSERT INTO #TmpTab values(0,0,0) select * from #TmpTab Drop Table #TmpTab')
Else
exec ('CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30) ) INSERT INTO #TmpTab values(0,0,0) select * from #TmpTab Drop Table #TmpTab')

GO

这样是可以了
smalldeer 2004-03-29
  • 打赏
  • 举报
回复
大力的方法是可以的
killStar 2004-03-29
  • 打赏
  • 举报
回复
大力,你的前一种方法我用过,但同样会报错,提示#TmpTab已经存在。
pengdali 2004-03-29
  • 打赏
  • 举报
回复
#局部临时表的生命周期的会话!!##全局临时表的生命周期是全局它是会冲突的!

你可以打开两个查询分析器,一个查询分析器的连接算是一个会话!
你分别创建两个同名的临时表是不会发生错误的!
而你别创建两个同名的全局临时表是会发生错误的!
pengdali 2004-03-29
  • 打赏
  • 举报
回复
或:

CREATE PROCEDURE AAA @iYear Smallint As

If @iYear<2000
Exec('CREATE TABLE ##TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))')
Else
Exec('CREATE TABLE ##TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))')

Exec('INSERT INTO ##TmpTab values(0,0,0)')
Exec('Drop Table ##TmpTab')
GO
pengdali 2004-03-29
  • 打赏
  • 举报
回复
CREATE PROCEDURE AAA @iYear Smallint As

If @iYear<2000
CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))
Else
CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))

Exec('INSERT INTO #TmpTab values(0,0,0)')
Exec('Drop Table #TmpTab')
GO
killStar 2004-03-29
  • 打赏
  • 举报
回复
看来只能创建固定表了。
progress99 2004-03-27
  • 打赏
  • 举报
回复
1. sql不支持這種方式:
if ...
create table #t
else
create table #t
,用普通表就可以
if ...
create table t
else
create table t

2. 你用了三個 exec,每二個與第三個根本訪問不到第一個exec建的表。
leeboyan 2004-03-27
  • 打赏
  • 举报
回复
or:
CREATE PROCEDURE AAA @iYear Smallint As

If @iYear<2000
begin
Exec('CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))')
end
Else
begin
Exec('CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))')
end
Exec('INSERT INTO #TmpTab values(0,0,0)')
Exec('Drop Table #TmpTab')
GO
progress99 2004-03-27
  • 打赏
  • 举报
回复
改為:
declare @sql varchar(1000)
If @iYear<2000
set @sql ='CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))'
Else
set @sql ='CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))'
set @sql =@sql+' INSERT INTO #TmpTab values(0,0,0)'
set @sql =@sql+' Drop Table #TmpTab'

exec(sql)

leeboyan 2004-03-27
  • 打赏
  • 举报
回复
try:
CREATE PROCEDURE AAA @iYear Smallint As

If @iYear<2000
Exec('CREATE TABLE #TmpTab(序号 varchar(3),文本 varchar(1000),填写 varchar(30))')
Exec('Drop Table #TmpTab')
Else
Exec('CREATE TABLE #TmpTab(序号 varchar(3),流程 varchar(20),负责人 varchar(30))')

Exec('INSERT INTO #TmpTab values(0,0,0)')
Exec('Drop Table #TmpTab')
GO

34,590

社区成员

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

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