能正常出结果的服务器(Windows2008R2+sql2008R2)执行跟踪:
go
exec sp_executesql N' DELETE FROM 核价单身档 WHERE 核价单号 = ( @P1 )
',N'@P1 varchar(28)','HJ201312040001'
go
exec sp_executesql N'  WITH TABLE1 AS ( SELECT 1 阶次 , ( @P1 ) 查询品号 , QAB001 , QAB003 , QAB005 , QAB006 FROM SGMQAB WHERE SGMQAB.QAB001 = ( @P2 ) UNION ALL SELECT T . 阶次 + 1 , ( @P3 ) MAIN , S.QAB001 , S.QAB003 , S.QAB005 , S.QAB006 FROM SGMQAB S JOIN TABLE1 T ON T . QAB003 = S.QAB001 ) INSERT INTO 核价单身档 ( 核价单号 , 品号 , 品名 , 规格 , 最近进价 , 核定用量 ) SELECT ( @P4 ) , TPADEA.DEA001 , TPADEA.DEA002 , TPADEA.DEA057 , isnull ( DGB005 , 0 ) , ( QAB005 / QAB006 )* ( @P5 ) FROM TABLE1 LEFT JOIN TPADEA ON QAB003 = DEA001 LEFT JOIN TPADGB ON DEA001 = DGB002 WHERE DEA009 = ''P''
',N'@P1 varchar(16),@P2 varchar(16),@P3 varchar(16),@P4 varchar(28),@P5 varchar(4)','99102001','99102001','99102001','HJ201312040001','80'
go
不能正常出结果服务器(Windows2003R2+sql2008R2)执行跟踪:
select @p1
go
exec sp_unprepare 73
go
SET NO_BROWSETABLE OFF
go
exec sp_executesql N' DELETE FROM 核价单身档 WHERE 核价单号 = ( @P1 )
',N'@P1 varchar(28)','HJ201312030001'
go
exec [CS]..sp_procedure_params_rowset N'WITH',1,NULL,NULL     
go
SET NO_BROWSETABLE ON
go
SET FMTONLY ON exec   WITH TABLE1 AS ( SELECT 1 阶次 , (   SET FMTONLY OFF
go
set fmtonly off
go
SET NO_BROWSETABLE OFF
go
exec sp_executesql N'exec   WITH TABLE1 AS ( SELECT 1 阶次 , ( @P1 ) 查询品号 , QAB001 , QAB003 , QAB005 , QAB006 FROM SGMQAB WHERE SGMQAB.QAB001 = ( @P2 ) UNION ALL SELECT T . 阶次 + 1 , ( @P3 ) MAIN , S.QAB001 , S.QAB003 , S.QAB005 , S.QAB006 FROM SGMQAB S JOIN TABLE1 T ON T . QAB003 = S.QAB001 ) INSERT INTO 核价单身档 ( 核价单号 , 品号 , 品名 , 规格 , 最近进价 , 核定用量 ) SELECT ( @P4 ) , TPADEA.DEA001 , TPADEA.DEA002 , TPADEA.DEA057 , isnull ( DGB005 , 0 ) , ( QAB005 / QAB006 )* ( @P5 ) FROM TABLE1 LEFT JOIN TPADEA ON QAB003 = DEA001 LEFT JOIN TPADGB ON DEA001 = DGB002 WHERE DEA009 = ''P''
',N'@P1 varchar(16),@P2 varchar(16),@P3 varchar(16),@P4 varchar(28),@P5 varchar(4)','99102001','99102001','99102001','HJ201312030001','80'
go
SET NO_BROWSETABLE ON菜鸟请问请问这二者是什么的区别?为什么在不同服务器的的结果会不一样呢?

解决方案 »

  1.   

    这是同一个EXE程序在二台不同的机器上执行的结果跟踪我是在程序里直接拼成一段SQL语句的,可服务器上确不能执行
    我用SQL跟踪的结果就是二者不同
      

  2.   


    你的意思是 程序一样,但是经过跟踪,发现 执行的sql代码不一样,是这个意思吗
      

  3.   


    你的意思是 程序一样,但是经过跟踪,发现 执行的sql代码不一样,是这个意思吗
    是的...
      

  4.   


    你的意思是 程序一样,但是经过跟踪,发现 执行的sql代码不一样,是这个意思吗
    是的...对了,你说结果不一样,是报错,还是什么
      

  5.   


    你的意思是 程序一样,但是经过跟踪,发现 执行的sql代码不一样,是这个意思吗
    是的...对了,你说结果不一样,是报错,还是什么
    系统没有报错,但没有得到想要的结果.跟没有执行语句是一样
      

  6.   

     WITH TABLE1 AS ( SELECT 1 阶次 , ( @P1 ) 查询品号 , QAB001 , QAB003 , QAB005 , QAB006 FROM SGMQAB WHERE SGMQAB.QAB001 = ( @P2 ) UNION ALL SELECT T . 阶次 + 1 , ( @P3 ) MAIN , S.QAB001 , S.QAB003 , S.QAB005 , S.QAB006 FROM SGMQAB S JOIN TABLE1 T ON T . QAB003 = S.QAB001 ) INSERT INTO 核价单身档 ( 核价单号 , 品号 , 品名 , 规格 , 最近进价 , 核定用量 ) SELECT ( @P4 ) , TPADEA.DEA001 , TPADEA.DEA002 , TPADEA.DEA057 , isnull ( DGB005 , 0 ) , ( QAB005 / QAB006 )* ( @P5 ) FROM TABLE1 LEFT JOIN TPADEA ON QAB003 = DEA001 LEFT JOIN TPADGB ON DEA001 = DGB002 WHERE DEA009 = ''P''
    ',N'@P1 varchar(16),@P2 varchar(16),@P3 varchar(16),@P4 varchar(28),@P5 varchar(4)','99102001','99102001','99102001','HJ201312030001','80'我把上面这段代码修改成正常的SQL语句后(就是把'参数'用'值'补充进去的),在不正常的服务器上进行执行,可以正常执行,能得到相应的结果.
      

  7.   


    你的意思是 程序一样,但是经过跟踪,发现 执行的sql代码不一样,是这个意思吗
    是的...对了,你说结果不一样,是报错,还是什么
    系统没有报错,但没有得到想要的结果.跟没有执行语句是一样我看了一下你贴出来的2次跟踪结果,发现第二次的语句,第一个delete语句是一样的,但是第二个你用的cte递归查询把,在当中就有问题了,你看看:
    我觉得这个是有问题的关键
      

  8.   

    我在想,为什么会多出来这么一段代码呢,你确定两边的程序一样?exec [CS]..sp_procedure_params_rowset N'WITH',1,NULL,NULL     
    go
    SET NO_BROWSETABLE ON
    go
    SET FMTONLY ON exec   WITH TABLE1 AS ( SELECT 1 阶次 , (   SET FMTONLY OFF
    go
    set fmtonly off
    go
    SET NO_BROWSETABLE OFF
    go
      

  9.   


    同一个EXE程序,我也在想为什么会多这么一段代码出来???
      

  10.   

    SET FMTONLY ON exec   WITH TABLE1 AS ( SELECT 1 阶次 , (   SET FMTONLY OFF这一句明显是截断的SQL语句
      

  11.   


    对,就是语句都不全,很奇怪
    是不是服务器的环境有问题?
    有可能,如果你确定程序是一样的,也就是程序没问题。那么就更加奇怪了,我刚才查了一下,第2个语句,多出来的部分:SET FMTONLY ON 解释:
    当 SET FMTONLY 为 ON 时,将不对行进行处理,也不将行作为请求的结果发送到客户端。
      

  12.   

    我觉得这种语句,SET FMTONLY ON ,不会突然就出现,我觉得程序有问题的可能,还是挺大的。设置完SET FMTONLY ON 会导致,你的语句执行后,只返回列,不返还任何的结果
      

  13.   


    是的,确定同一个EXE程序,
      

  14.   

    我觉得windows server 2003和2008应该不会有那么大的区别,你能在别的2008 server上模拟一下不?