[待解决问题] 字符串拼接的存储过程/视图/函数 效率问题!
提问时间: 2008-05-05 01:44
悬赏分:10 离问题结束还有 2 天 12 小时 浏览:144 次

字符串拼接的存储过程/视图/函数 效率问题!

如USE [PMS_HZTEST]

ALTER PROCEDURE [dbo].[FIN_CurrentDepositLedger_Select]
(
 @PID BIGINT,
 @LGID BIGINT = NULL
)
AS
SET NOCOUNT OFF;
DECLARE @SQL_Statement NVARCHAR(3000);

BEGIN

 IF @LGID IS NULL
  BEGIN
  SET @LGID=dbo.dpk_FD_DefaultLanguage();
  END

 SET @SQL_Statement = '
SELECT DISTINCT CASE WHEN z.stayBKTID=2
   THEN ''G''+IsNull(z.stayResvNo,'''')
   ELSE IsNull(z.stayResvNo,'''')
  END AS RESV#,z.stayHDID,
 z.BusinessDate AS RESV_DATE,
 dbo.uf_RPT_GetGuestName(z.stayBKTID,z.stayGuestPFID,z.stayDelegateFamilyName,z.stayDelegateGivenName, b.pfFamilyName,b.pfGivenName,c.hdGroupName) AS GUSET_NAME,
 stayArrivalDate AS ARRIVAL,
 [dbo].[uf_RPT_GetNoOfNTS](z.stayArrivalDate, z.stayDepartureDate) AS #NTS,
 ISNULL(e.rtCode,'''') AS RM_TYPE,
 dbo.uf_RPT_GetNoOfRoom_CurDepositLedger(z.PID,z.stayBKTID,e.rtROID,d.roomRTID,e.rtIsAffectAvail,z.stayShareWithSTID,z.stayHDID) AS #ROOM,
 dbo.uf_RPT_GetRMRate(z.pid,z.stayID,'+CAST(@LGID AS NVARCHAR)+','''+CONVERT(NVARCHAR(20),@BusinessDate,111)+''') AS RM_RATE,
 [dbo].[uf_RPT_GetTotalRoomCharges](z.PID,z.StayID,z.stayBKTID,z.stayHDID) AS TOTAL_ROOM_CHARGES,
 IsNull(a.dltAmt,0) AS DEPOSIT_RECEIVED,
 [dbo].[uf_RPT_Get_DiscountAmt](z.PID,z.StayID,z.stayBKTID,z.stayHDID) AS DISCOUNT_DEDUCTED,
 dbo.uf_RPT_GetHCV_dltID(z.PID,z.stayid) AS HCV#,
 a.BusinessDate AS DEPOSIT_DATE,
 ISNULL(g.plDesc,'''') AS PNAME,
 ISNULL(h.pCode,'''') AS PID,
 a.dltid
FROM TXN_Stay z(NOLOCK)
 INNER JOIN TXN_DepositLedgerTxn a(NOLOCK) ON (z.PID=a.PID AND z.STAYID=a.dltSTAYID)
 LEFT JOIN Resv_Profile b(NOLOCK) ON (b.PFID=z.stayGuestPFID AND b.PFID>0)
 INNER JOIN TXN_Header c(NOLOCK) ON (c.HDID = z.stayHDID AND c.PID=z.PID)
 INNER JOIN Txn_Room d(NOLOCK) ON (z.stayROOMID=d.ROOMID AND d.PID=z.PID)
 LEFT JOIN FO_RoomType e(NOLOCK) ON (e.RTID=d.roomRTID AND e.PID=d.PID)
 INNER JOIN FO_Property h(NOLOCK) ON (h.PID=z.PID)
 LEFT JOIN vw_Property_Local g(NOLOCK) ON (g.PID=h.PID AND g.LGID='+CAST(@LGID AS NVARCHAR)+' AND g.IsDeleted=0)
WHERE STAYID>0 AND z.stayInhouseSTID=102001 AND a.dltSTID IN (112001, 112004, 112009) AND a.dltType=1 ';

 PRINT @SQL_Statement;
 
 print len(@SQL_Statement);
 
 EXECUTE (@SQL_Statement);

 RETURN 0;
END

------------------------------------------------------------------

字符串拼接的存储过程中->函数多点好? 还是视图多点好? 还有写子查询?

在性能上那个好一点?


 

 


提问者:IamV - 初学一级
所有回答(5)
你太强了 竟然将那么多的表都联接查询 你的表关系真有那么复杂吗?
我最多的也就四个表进行过查询 看看你的数据库还能不能改进哈?
字符串拼接并不影响效率 但是转换成视图就不好了 
函数是封装好的 这个也没什么的 
写存储过程 最好不要用视图 
1周前   回答者:yeyang - 菜鸟二级
昏`~看到这一大堆东西就头皮发麻~~很多时候把数据加载到内存再进行处理会更方便一些. 写成这种太难维护了`~
1周前   回答者:沙加 - 老鸟四级
貌似只有一个查询的样子,
上帝保佑你!
1周前   回答者:风海迷沙 - 菜鸟二级
这段SQL语句我没有细看(主要是因为排版的缘故),只是简单说说我的看法:

1. 你的这个多表查询的确是长了点,不过不要因此就修改数据库结构,不是因为“牵一发而动全身”,而是数据库结构优化要全盘考虑,决不能因为一条语句就跑去瞎改。
2. 函数、视图、子查询,这三者的性能没有必然的顺序。
3. 你的这个存储过程没有给全,对吧?
4. 两条print语句是测试用的?
5. 最后面的return用来干什么的?
6. 请仔细分析你的SQL语句,看看是不是可以避免使用动态SQL。(我大概看了你的那条动态SQL,好像完全可以用避免的)
1周前   回答者:电机拖动 - 小虾三级
建议取出来数据之后在逻辑层做处理。而不是把所有的数据都在sql server上拼接好
3天前   回答者:玉开 - 菜鸟二级
1周前   IamV :
那如果确实有 6,7个表关联起来查数据 还有变量,限制条件等~
应该怎么做呢?
2天前   IamV :
我这个存储过程是用在ReportService中,需要直接返回数据, 现在主要想问下!
视图/函数 在性能上的区别!
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除