日期:2014-05-18  浏览次数:20573 次

SQL存储过程动态拼接SQL,INTO 实表改临时表
如我有存储过程
set @sql1 = '
SELECT 大类名称,COUNT(*) 款色数 
INTO ZDYB_款色数
 FROM (
SELECT C.大类名称, A.SPDM,A.GG1DM
FROM vw_CKJXCMX A
JOIN SHANGPIN B ON A.SPDM = B.SPDM
JOIN A_商品名称分类 C ON B.SPMC = C.商品名称
WHERE
b.BYZD8 ='+@年份+' AND BYZD5 IN ('+@季节+') AND a.SPDM = B.SPDM
AND
RQ >='''+@时间前+''' AND RQ <='''+@时间后+''' AND QDDM = '+@渠道+' and a.sl >0
GROUP BY C.大类名称,A.SPDM,A.GG1DM
) ccC
group by 大类名称'
exec (@sql1)
后面用完 表 ZDYB_款色数,就DROP TABLE ZDYB_款色数了
单独执行没问题,但是现在我这个存储过程要执行30秒左右,因为用的是实表,这30秒就不能用其他用户执行了,会报错,
那怎么解决同时执行的问题呢?
直接把表 ZDYB_款色数 改成 【#ZDYB_款色数】 会报错,好像是动态SQL里面不能用临时表还是怎么的。
求解决方案

------解决方案--------------------
可以使用临时表.而且在临时表只在本次会话中起作用.所以多用户同时操作,不受影响.

set @sql1 = '
SELECT 大类名称,COUNT(*) 款色数
INTO #ZDYB_款色数
 FROM (
SELECT C.大类名称, A.SPDM,A.GG1DM
FROM vw_CKJXCMX A
JOIN SHANGPIN B ON A.SPDM = B.SPDM
JOIN A_商品名称分类 C ON B.SPMC = C.商品名称
WHERE
b.BYZD8 ='+@年份+' AND BYZD5 IN ('+@季节+') AND a.SPDM = B.SPDM
AND
RQ >='''+@时间前+''' AND RQ <='''+@时间后+''' AND QDDM = '+@渠道+' and a.sl >0
GROUP BY C.大类名称,A.SPDM,A.GG1DM
) ccC
group by 大类名称'
exec (@sql1)

------解决方案--------------------
探讨

可以使用临时表.而且在临时表只在本次会话中起作用.所以多用户同时操作,不受影响.

set @sql1 = '
SELECT 大类名称,COUNT(*) 款色数
INTO #ZDYB_款色数
FROM (
SELECT C.大类名称, A.SPDM,A.GG1DM
FROM vw_CKJXCMX A
JOIN SHANGPIN B ON A.SPDM = B.SPDM
J……

------解决方案--------------------
探讨
可以使用临时表.而且在临时表只在本次会话中起作用.所以多用户同时操作,不受影响.

------解决方案--------------------
探讨
=。= 我快哭了。。。。。 动态SQL里面不能使用临时表呀。。。。。。