首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

關於臨時表,该怎么处理

2012-01-21 
關於臨時表各位新年好!小弟實際應用中編寫如下兩存儲應過程,每次都得寫字段名及數據類型,總覺不爽,是否有

關於臨時表
各位新年好!

小弟實際應用中編寫如下兩存儲應過程,每次都得寫字段名及數據類型,總覺不爽,是否有更好的改進方法?還望各位賜教。
1、
Create PROCEDURE Stockfx_1
@where varchar(1000)
as
Create table #temp(dept varchar(10),
  jobno varchar(15),
  subjobno varchar(15),
  flowno varchar(10),
  partno varchar(25),
  stockqty numeric(12,4),
  indate datetime,
  unit nvarchar(10),
  [name] nvarchar(60),
  jobdate datetime,
  model varchar(15),
  flowdesc nvarchar(20))  

declare @cSql varchar(1800)
set @cSql='Insert into #temp
  SELECT b.dept,b.jobno,b.subjobno,b.flowno,b.partno,
b.qty as stockqty,b.indate,a.unit,a.name,c.jobdate,c.model,d.flowdesc 
FROM icdistmap b LEFT JOIN icmt a ON b.partno=a.partno 
LEFT JOIN jobmain c ON b.jobno=c.jobno LEFT JOIN setflow d ON b.flowno=d.flowno 
WHERE '+ @where

exec(@cSql)
if @@error<>0
begin
  truncate table #temp
  drop table #temp
  return
end

Select * From #temp

SELECT distinct a.institem,a.subjobno,a.institem 
  From instmt a inner join #temp b on a.subjobno=b.subjobno

SELECT distinct a.partno as partno1,a.subjobno From jobflow a inner join #temp b on a.subjobno=b.subjobno

truncate table #temp
drop table #temp


2、

Create PROCEDURE wkspeed_2
@model varchar(15)
AS
Declare @temp table(no numeric(2),
  smtno varchar(15),
  jobno varchar(15),  
  flowno varchar(10),
  partno varchar(25),
  item varchar(25),
  fgmt char(1),
  faqty numeric(12,4) )
Insert into @temp 
  Select b.no,b.smtno,b.jobno,b.flowno,b.partno,b.item,b.fgmt,b.faqty 
  From sendmt1 b Left Join jobmain a On b.jobno=a.jobno 
  Where a.model=@Model And a.flagStats='JOR'
Select * from @temp
Select Distinct b.no,b.smtno,b.smtdate,b.fadate,b.outdept,b.indept,b.bumt,b.flagStats 
  From sendmt0 b INNER Join @temp a On b.no=a.no And b.smtno=a.smtno

[解决办法]
啥么意思?没看懂
[解决办法]
可以直接用select col1,col2 into #temp from tab where ...自动创建临时表
[解决办法]
2楼正解
[解决办法]
你创建临时表,然后再查询出里面的数据,为何不直接查询,所用的表上加索引即可
[解决办法]
用wkspeed_2举个例子:

SQL code
2005可用:with tmp(smtno,jobno,flowno,partno,item,fgmt,faqty)as(     Select   b.no,b.smtno,b.jobno,b.flowno,b.partno,b.item,b.fgmt,b.faqty           From   sendmt1   b   Left   Join   jobmain   a   On   b.jobno=a.jobno           Where   a.model=@Model   And   a.flagStats='JOR' )Select   Distinct   b.no,b.smtno,b.smtdate,b.fadate,b.outdept,b.indept,b.bumt,b.flagStats           From   sendmt0   b   INNER   Join   tmp   a   On   b.no=a.no   And   b.smtno=a.smtno2000可用:        Select   b.no,b.smtno,b.jobno,b.flowno,b.partno,b.item,b.fgmt,b.faqty   into #        From   sendmt1   b   Left   Join   jobmain   a   On   b.jobno=a.jobno           Where   a.model=@Model   And   a.flagStats='JOR' Select   Distinct   b.no,b.smtno,b.smtdate,b.fadate,b.outdept,b.indept,b.bumt,b.flagStats           From   sendmt0   b   INNER   Join   #   a   On   b.no=a.no   And   b.smtno=a.smtno 


[解决办法]
如果你是动态构建则 #temp是不行的,因为属于另外一个访问域。
如果你非要如此就需要用##temp全局临时表,但这时你要注意并发的问题。而且解决的不好不旦可以出现脏读,幻像读,而且性能也会受到极大的影响,
所以建议还是显示声明出来。
[解决办法]
可以这样使用,就在一个域中了,INSERT INTO #T EXEC(@sql);
#和#tmp一样的,只有一个临时表,不取名字也是可以的。

热点排行