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

继续纠结动态游标问题
SQL code

SET @V_TMP_SQL_CUR='FETCH NEXT FROM CUR_SCR_SGMNT_'+@V_BTCH_EXAM_ID+' into @V_SGMNT_ID,@LWR_SCR,@LWR_CNDTN,@LMT_SCR,@LMT_CNDTN,@V_SGMNT_NM '
PRINT @V_TMP_SQL_CUR
EXEC sp_executesql @V_TMP_SQL_CUR,N'@V_SGMNT_ID NVARCHAR(40),@LWR_SCR DECIMAL(10,2),@LWR_CNDTN NVARCHAR(40),@LMT_SCR DECIMAL(10,2),@LMT_CNDTN NVARCHAR(40),@V_SGMNT_NM NVARCHAR(100) OUT',@V_SGMNT_ID,@LWR_SCR,@LWR_CNDTN,@LMT_SCR,@LMT_CNDTN,@V_SGMNT_NM OUTPUT
SET @k = @k+1;
PRINT '打印:@V_SGMNT_ID ='+@V_SGMNT_ID
PRINT @V_SQL_STR
    IF (@k = 1)
     BEGIN                                          
        SET @V_SQL_STR = @V_SQL_STR+'( CASE  '
        SET @V_SQL_SGMNT_NM = @V_SQL_SGMNT_NM+'( CASE '
     END
                                    
    PRINT 'k'+CAST(@k AS VARCHAR(10))+'>>>>>>@V_SQL_STR='+ISNULL(@V_SQL_STR,'NULL')
    PRINT 'k'+CAST(@k AS VARCHAR(10))+'>>>>>>@V_SQL_SGMNT_NM='++ISNULL(@V_SQL_STR,'NULL')
……



循环过程中发现,fetch输出的结果,只有数据最有一个字段有值,其余均为null
FETCH NEXT FROM CUR_SCR_SGMNT_20111208140702884 into @V_SGMNT_ID,@LWR_SCR,@LWR_CNDTN,@LMT_SCR,@LMT_CNDTN,@V_SGMNT_NM 
打印:@V_SGMNT_ID =
CASE WHEN SUB_ID = 1 THEN

k1>>>>>>@V_SQL_STR=CASE WHEN SUB_ID = 1 THEN
( CASE
k1>>>>>>@V_SQL_SGMNT_NM=CASE WHEN SUB_ID = 1 THEN
( CASE
@V_SGMNT_ID =
@LWR_CNDTN =
@LMT_CNDTN =
@V_SGMNT_NM =BSql Server 新手,还请大家指导!

------解决方案--------------------
一个游标效率已经够差的了,你还来个动态游标,你还想不想让服务器干点儿别的什么了啊!

游标里要用很多的变量,你做成动态以后,要把变量从动态执行中传来传去,丢一个都不行哪!
------解决方案--------------------
你说对了,所有的用了游标的存储过程(注意,不是你说的SP,SP是指system procedure,是系统存储过程),效率都低.这是不容置疑的.
游标用循环将查得的数据一个个赋给变量,再由变量来处理,而在绝大多数程序语句中,赋值语句是速度最慢的.因此,游标的效率和速度,你知道的!