日期:2014-05-17  浏览次数:20594 次

存储过程里临时表可能出错,清指教
下面是我写的一个存储过程,用于一个ASP.NET网站。功能是把两个表的内容合起来,写到一个临时表中,统一输出结果,最后删除临时表。

一般情况运行正常,但有时会有出错信息,估计是临时表#myTempTable的问题。请问高手,有没有好的解决方案?谢谢!


ALTER PROCEDURE [dbo].[spTeacherNoticesByYear] 
@year   integer,
@OrderByClause varchar(50) = 'ORDER BY X_Date DESC'

AS
BEGIN

SET NOCOUNT ON;

SELECT * INTO #myTempTable FROM (
SELECT X_Type=99, N_ID AS X_ID, N_Title AS X_Title, N_Date AS X_Date FROM tblTeacherNotices  WHERE YEAR(N_Date)=@year 
UNION ALL
SELECT X_Type=1,  D_ID AS X_ID, D_Title AS X_Title, D_Date AS X_Date FROM tblTeacherDocs     WHERE YEAR(D_Date)=@year
) AS temp

-- Create a variable @SQLStatement
DECLARE @SQLStatement varchar(255)

SELECT @SQLStatement = 'SELECT * FROM #myTempTable '  +  @OrderByClause

EXEC(@SQLStatement)

drop table #myTempTable

END

------解决方案--------------------
@OrderByClause varchar(50) = 'ORDER BY X_Date DESC'
你传一个表达式不太好吧,传一个标识就可以了,比如:0 表示asc,1 表示desc

然后

SELECT @SQLStatement = 'SELECT * FROM #myTempTable order by x_date '  +  case when @OrderByClause=0 then 'asc' else 'desc' end


------解决方案--------------------
什么错?临时表已存在?如果是,就用if object_id('tempdb..#临时表名','u') is not null drop talbe #xx这样来先删除再into生成
------解决方案--------------------
@OrderByClause varchar(50)

--> 会不会有时传入的排序条件写得太长,长度超过50,导致字符串被截断,
最终执行的@SQLStatement也就出错了.
------解决方案--------------------
我刚才试了一下,执行了好多遍,也没有报错。

能说一下,具体是报的上面错误吗?

在原来的公司项目上经常用临时表,一般就是报临时表已存在的错误,一般在存储过程中,可以这样修改:


--判断临时表是否已经存在,如果存在,就删除
if object_id('tempdb..#myTempTable') is not null
   drop table #myTempTable

select * into ……

------解决方案--------------------
一个#的是局部临时表,存在与一个会话中,不能共享,但是##可以共享