T-SQL执行问题

gw6328 2011-01-11 09:35:18

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步吧。
但是在服务器上,程序报错都是在这里。一天有一百多次这种运算,一般会出现几次这里的错误。这个问题怎么解决。
...全文
165 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
肯定是你第一个语句问题.应该优化优化了,是查询不同的数据吧?


SQL code
1.
SELECT [...],RN=ROW_NUMBER() OVER(ORDER BY [XX]) INTO [表名.这里是每一次创建一个表] FROM ( [这里是一个很大的表是一段时间内的数据,distinct] EXCEPT [一个大数据表] )


参考如下的内容,看是否有用?

S……
[/Quote]

前面两种方法不一定能提高效率,我试过,特别是第一种 is null那种会降低效率
gw6328 2011-01-11
  • 打赏
  • 举报
回复
第一个语句如下,设置超时时间为 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]
gw6328 2011-01-11
  • 打赏
  • 举报
回复
上面写的是超时,但是同样的情况下,并列的其它时段能运行,而且我设置过时间,如果设成1分钟,程序就1分钟后报错,如果设成2分钟,程序就两分错后报错。
dawugui 2011-01-11
  • 打赏
  • 举报
回复
肯定是你第一个语句问题.应该优化优化了,是查询不同的数据吧?

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 null

select * 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)
叶子 2011-01-11
  • 打赏
  • 举报
回复
解决方法:
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
mugua604 2011-01-11
  • 打赏
  • 举报
回复
CommandTimeout 是多少。。修改这个
mugua604 2011-01-11
  • 打赏
  • 举报
回复
timeout? 你的SQL连接事件可以调大。。
ws_hgo 2011-01-11
  • 打赏
  • 举报
回复
超时了吧
飘零一叶 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinfengyiye 的回复:]
引用 2 楼 dlut_liuq 的回复:
不知道报的是什么错误

System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。
在 Pee.Dal.DataAcq.DbDataCollDal.PrePageShow(DateTime startTime, DateTime end……
[/Quote]
优化下SQL1. ,可能数据量大导致超时。
gw6328 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dlut_liuq 的回复:]
不知道报的是什么错误
[/Quote]
System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。
在 Pee.Dal.DataAcq.DbDataCollDal.PrePageShow(DateTime startTime, DateTime endTime, Int32 frq, String tbBaseName)

PrePageShow这个方法就是运行了那个存储过程的。
飘零一叶 2011-01-11
  • 打赏
  • 举报
回复
不知道报的是什么错误
gw6328 2011-01-11
  • 打赏
  • 举报
回复
不好意思,刚才第2步就是返回一个总记录数,刚写错了。
SELECT TOP 1 RN FROM [表名,刚才查入数据的表] ORDER BY RN DESC


34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧