存储过程里临时表可能出错,清指教
下面是我写的一个存储过程,用于一个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 ……