T-Sql执行的问题
我有一个存储过程其只主要是这样两句
1.
SELECT [...],RN=ROW_NUMBER() OVER(ORDER BY [XX]) INTO [表名.这里是每一次创建一个表] FROM ( [这里是一个很大的表是一段时间内的数据,distinct] EXCEPT [一个大数据表] )
2.
SELECT TOP 1 RN FROM [表名,刚才查入数据的表]先 exec sp_executesql -- 1步
后 2.条语句
这样是数据库是先要把1步执行完了再执行第2步吧。
但是在服务器上,程序报错都是在这里。一天有一百多次这种运算,一般会出现几次这里的错误。这个问题怎么解决。

解决方案 »

  1.   

    不好意思,刚才第2步就是返回一个总记录数,刚写错了。
    SELECT TOP 1 RN FROM [表名,刚才查入数据的表] ORDER BY RN DESC
      

  2.   

    System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。
       在 Pee.Dal.DataAcq.DbDataCollDal.PrePageShow(DateTime startTime, DateTime endTime, Int32 frq, String tbBaseName)PrePageShow这个方法就是运行了那个存储过程的。
      

  3.   

    优化下SQL1. ,可能数据量大导致超时。
      

  4.   

    timeout? 你的SQL连接事件可以调大。。
      

  5.   

    CommandTimeout 是多少。。修改这个
      

  6.   

    解决方法:
    C#代码
    SqlCommand selectCommand = new SqlCommand(queryText, this.openConnection());
    //得到Web.config里DB_ConnectionString中Connection Timeout=90
    selectCommand.CommandTimeout = cn.ConnectionTimeout;
    或者
    SqlCommand selectCommand = new SqlCommand(queryText, this.openConnection());
    selectCommand.CommandTimeOut=0;Web.config(.NET 2005)
    <connectionStrings>
    <add name="DB_ConnectionString" connectionString="Data Source=xxx.xxx.xxx.xxx;Initial Catalog=DB NAME;Persist Security Info=false;User ID=sa;Password=sa;Connection Timeout=90;" providerName="System.Data.SqlClient"/>
    </connectionStrings>CommandTimeout 属性
    指示执行命令期间在终止尝试和产生错误之前需等待的时间。设置和返回值设置或返回 Long 值,该值指示等待命令执行的秒数。默认值为 30。详见:http://www.cnblogs.com/haoyi0418/articles/1031690.html
      

  7.   

    肯定是你第一个语句问题.应该优化优化了,是查询不同的数据吧?1.
    SELECT [...],RN=ROW_NUMBER() OVER(ORDER BY [XX]) INTO [表名.这里是每一次创建一个表] FROM ( [这里是一个很大的表是一段时间内的数据,distinct] EXCEPT [一个大数据表] )参考如下的内容,看是否有用?
    如何从表A(总表)中找出表B(分表)中不存在的记录组合假设表A和表B都只有两个字段id,name
    如何用一句SQL返回表A中存在的id,name结果集而在表B中不存在的id,name结果集select A.* from A left join B on A.id=B.id and A.name=B.name where B.id is nullselect * from A where not exists(select top 1 * from B where A.ID=B.ID)这两个都可以.
    --前提:表中不能有text、ntext、image、cursor 数据类型的字段。用CheckSum()最简单:select * from A where checksum(*) not in (select checksum(*) from B)
      

  8.   

    第一个语句如下,设置超时时间为 120秒IF OBJECT_ID('TB_20110108_tmp_1010') IS NOT NULL 
    DROP TABLE TB_20110108_tmp_1010   
    SELECT T1.[SiteId],T1.[AdId], COUNT([Ip]) AS [ShowIp],0 AS [ClickIp],RN=ROW_NUMBER() OVER(ORDER BY T1.[SiteId],T1.[AdId]) INTO TB_20110108_tmp_1010 
    FROM (     
    SELECT DISTINCT [SiteId],[AdId],[Ip] FROM TB_20110108 A WHERE [RecTime]>=@startTime AND [RecTime]<@endTime     
    EXCEPT     
    SELECT [SiteId],[AdId],[Ip] FROM TB_AbsIp_20110108     
    ) T1 
    GROUP BY T1.[SiteId],T1.[AdId] 
      

  9.   


    前面两种方法不一定能提高效率,我试过,特别是第一种 is null那种会降低效率