在一个存储过程CustomFeed_ExportDataToXLS中,用到多个 Exec(SQLScript) ;
其中使用了多个系统临时表来存临时数据,比如以下语句:if exists (select * from tempdb..sysobjects where name = '##TempExportData')
  drop table ##TempExportDataif exists (select * from tempdb..sysobjects where name = '##TempExportData2')
  drop table ##TempExportData2--add identity(int,1,1) for order to export
SELECT @sql = 'select identity(int,1,1) as TableId, ' + @columnNames + ' into ##TempExportData2'
exec (@sql)  SELECT @sql = 'Insert into ##TempExportData2 Select ' + @columnConvert + ' from ##TempExportData'
exec (@sql)  SELECT @sql = 'select '+ @columnConvert + ' into ##TempExportData3 from ##TempExportData2 order by TableId'
exec (@sql)  --select * from ##TempExportData3 order by TableIdif @fileformate = 1 --CSV format file,use -t","
begin
  select @sql = 'bcp "select * from ' + @dbName + '##TempExportData3" queryout "' + @path + '' + @filename + '.csv" -c -t"," -S' + @@SERVERNAME + ' -E '+@UsrPwd  
end
if @fileformate = 2 --xls format ,use -c -q
begin
  select @sql = 'bcp "select * from ' + @dbName + '##TempExportData3" queryout "' + @path + '' + @filename + '.xls" -c -q -S' + @@SERVERNAME + ' -E '+@UsrPwd   
enddrop table ##TempExportData  
drop table ##TempExportData2  说明:##TempExportData系统临时表存没有表头的数据;
     ##TempExportData2存带表头(@columnNames)的数据,并加了一个identity(int,1,1) as TableId字段;
    在测试过程中往往表头不在##TempExportData2表的第一列,所有按TableId顺序再存到##TempExportData3,然后输出;现在的问题是:
如果多用户环境下,这些系统表##TempExportData....里面的数据可能有混乱错误,
因为很多用户下,都调用同一个存储过程CustomFeed_ExportDataToXLS去输出不同的表的数据出来.不同的表,表字段名(@columnNames)和表列(@columnConvert)不同,所有系统临时表有错误的可能.
    
怎么能解决这个问题呢? 用户临时表能解决这个问题吗? 
避免使用系统临时表.

解决方案 »

  1.   

    你这个临时表的表名不能是固定的啊,要不然别的用户进来操作时,判断存在了,删了,那这个用户的工作不就白做了?你可以这样做,做个表,列名只有一列iid Int,然后写个存储过程去取当前的iid赋值给@iid,然后让当前的iid+1,取出来的这个@iid作为你临时表名的一部分,比方说可以作为表名的后缀,那么这样每个用户进去的时候建立的表名都不一样,即使同一个用户进去了,建立的表也不一样。可以不?