关于数据查询时的"超时已过期"的问题

真如实观 2005-05-16 09:07:27
我已经在"工具->选项->高级"将查询超时设为0,同时也将连接超时设为0,但是没有见效.
我这个查询比较复杂:
SELECT YPBM=NR.BM, YPMC=NR.MC, NR.BZ, NR.GG,SF.YS,NR.DW,NR.BZS,NR.BZDW, " ;
strSQL1+=" DJ=CASE WHEN ZY.BM IS NULL THEN CF.DJ ELSE ZY.DJ END, " ;
strSQL1+=" SL=CASE WHEN ZY.BM IS NULL THEN CF.ZL ELSE CF.ZL * ZY.YL END, " ;
strSQL1+=" JE=CASE WHEN ZY.BM IS NULL THEN CF.FY ELSE CF.ZL * ZY.FY END " ;
strSQL1+=" INTO #TMP " ;
strSQL1+=" FROM "+VIEW_SF+" SF,"+ VIEW_CF+" CF " ;
strSQL1+=" LEFT JOIN MZ_ZYCF ZY ON CF.CFID=ZY.CFID, ZD_MZCFNR NR ";
strSQL1+=" WHERE SF.SFID=CF.SFID AND SF.STATE & 0x85=0x04 " ;
strSQL1+=" AND NR.BM=CASE WHEN ZY.BM IS NULL THEN CF.BM ELSE ZY.BM END " ;
strSQL1+=" AND CASE WHEN ZY.BM IS NULL THEN CF.LX ELSE 3 END IN (0,4) " ;
strSQL1+=" AND NR.JB & 511>0x00 AND NR.JX IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, ";
strSQL1+=" 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50) ";
//strSQL1+=" AND SF.SFRQ>=("+IntToStr(day1)+"+ DATEDIFF(DAY, '1899-12-30','"+MyDate3+"')-1) ";
//strSQL1+=" and SF.SFRQ<=("+IntToStr(day2)+"+ DATEDIFF(DAY, '1899-12-30','"+MyDate4+"') - 1) ";
strSQL1+=" AND SF.SFRQ>=(DATEDIFF(DAY, '1899-12-30','"+MyDate1+"')) ";
strSQL1+=" and SF.SFRQ<=(DATEDIFF(DAY, '1899-12-30','"+MyDate2+"')) ";
strSQL1+=" AND NR.BM IN("+Memo1->Lines->Text+")";
TempADOCommand->CommandText=strSQL1;
try
{
TempADOCommand->Execute();
}
catch(EADOError *e)
{
MessageBox(Application->Handle,e->Message.c_str(),this->Caption.c_str(),MB_ICONWARNING);
}

dm->CFYPDataSet->Close();

strSQL2="SELECT C.MC '科室',B.MC '医生姓名',A.YPBM '药品编码', A.YPMC '药品名称', A.BZ '包装', A.GG '规格', A.DJ '单价', ";
strSQL2+="消耗量1=ltrim(str(SUM(A.SL),len(str(SUM(A.SL))),2))+A.DW, 消耗量2=ltrim(str(sum(A.SL)/A.BZS, ";
strSQL2+=" len(str(sum(A.SL)/A.BZS)),2))+A.BZDW,金额=SUM(A.JE) ";
strSQL2+="FROM #TMP A,ZD_RY B,ZD_KS C ";
strSQL2+="WHERE A.YS=B.BM and B.MZKS=C.BM ";
strSQL2+="GROUP BY A.YPBM, A.YPMC, A.BZ, A.GG,A.DJ,B.MC,A.DW,A.BZS,A.BZDW,C.MC ";
strSQL2+="ORDER BY A.YPBM ";
dm->CFYPDataSet->CommandText=strSQL2;
try
{
dm->CFYPDataSet->Open();
}
catch(EADOError *e)
{
MessageBox(Application->Handle,e->Message.c_str(),this->Caption.c_str(),MB_ICONWARNING);
}

TempADOCommand->CommandText="drop table #TMP";
try
{
TempADOCommand->Execute();
}
catch(EADOError *e)
{
MessageBox(Application->Handle,e->Message.c_str(),this->Caption.c_str(),MB_ICONWARNING);
}
delete TempADOCommand;
//-------------------------------------------------------------------------------------
问题在:strSQL1+=" AND NR.BM IN("+Memo1->Lines->Text+")";上,Memo1是个备注框,里面放置的数据格式为:1254,1548,4584,5652......等,如果是十个以下还可以,不然为提示:"超时已过期".
另外,我把上面的语句放到查询分析器里也同样产生"超时已过期".
但是,这个数据库是从MS SQL Server7.0升级过来的(附加数据库文件,同时升级了数据结构),在SQL Server7.0上没有任何问题,在SQL Server 2k就不行,十分纳闷.
我现在试问:
1、语句是否可以再优化,或者改成存贮过程?该如何写?
2、是否是数据库服务器配置不当?如何配置?
...全文
520 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
真如实观 2005-05-20
  • 打赏
  • 举报
回复
难道windows NT4.0 server和windows 2000 server有什么不同吗?
真如实观 2005-05-20
  • 打赏
  • 举报
回复
奇怪,在NT4上问题没有了!不知道什么原因,而且sql server2k用的是默认设置,就是说我安装sql server2k后就没动过.
真如实观 2005-05-18
  • 打赏
  • 举报
回复
楼上的兄弟,我改成6000也一样.
真如实观 2005-05-17
  • 打赏
  • 举报
回复
我已经执行 exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
go
了,可是没有效果,看来只能从语句着手了,不知道该如何改,请zjcxc老大帮看一下好吗?

SELECT YPBM=NR.BM, YPMC=NR.MC, NR.BZ, NR.GG,SF.YS,NR.DW,NR.BZS,NR.BZDW,
DJ=CASE WHEN ZY.BM IS NULL THEN CF.DJ ELSE ZY.DJ END,
SL=CASE WHEN ZY.BM IS NULL THEN CF.ZL ELSE CF.ZL * ZY.YL END,
JE=CASE WHEN ZY.BM IS NULL THEN CF.FY ELSE CF.ZL * ZY.FY END
INTO #TMP
FROM mz_sf200503 SF, mz_cf200503 CF
LEFT JOIN MZ_ZYCF ZY ON CF.CFID=ZY.CFID, ZD_MZCFNR NR
WHERE SF.SFID=CF.SFID AND SF.STATE & 0x85=0x04
AND NR.BM=CASE WHEN ZY.BM IS NULL THEN CF.BM ELSE ZY.BM END
AND CASE WHEN ZY.BM IS NULL THEN CF.LX ELSE 3 END IN (0,4)
AND NR.JB & 511>0x00 AND NR.JX IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50)

AND SF.SFRQ>=(DATEDIFF(DAY, '1899-12-30','2005-03-01'))
and SF.SFRQ<=(DATEDIFF(DAY, '1899-12-30','2005-03-30'))
AND NR.BM IN(1254,2005,5871,2365,2015,2545,2035,2589,......) --主要问题在这
真如实观 2005-05-17
  • 打赏
  • 举报
回复
我已经执行 exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
go
了,可是没有效果,看来只能从语句着手了,不知道该如何改,请zjcxc老大帮看一下好吗?

SELECT YPBM=NR.BM, YPMC=NR.MC, NR.BZ, NR.GG,SF.YS,NR.DW,NR.BZS,NR.BZDW,
DJ=CASE WHEN ZY.BM IS NULL THEN CF.DJ ELSE ZY.DJ END,
SL=CASE WHEN ZY.BM IS NULL THEN CF.ZL ELSE CF.ZL * ZY.YL END,
JE=CASE WHEN ZY.BM IS NULL THEN CF.FY ELSE CF.ZL * ZY.FY END
INTO #TMP
FROM mz_sf200503 SF, mz_cf200503 CF
LEFT JOIN MZ_ZYCF ZY ON CF.CFID=ZY.CFID, ZD_MZCFNR NR
WHERE SF.SFID=CF.SFID AND SF.STATE & 0x85=0x04
AND NR.BM=CASE WHEN ZY.BM IS NULL THEN CF.BM ELSE ZY.BM END
AND CASE WHEN ZY.BM IS NULL THEN CF.LX ELSE 3 END IN (0,4)
AND NR.JB & 511>0x00 AND NR.JX IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50)

AND SF.SFRQ>=(DATEDIFF(DAY, '1899-12-30','2005-05-01'))
and SF.SFRQ<=(DATEDIFF(DAY, '1899-12-30','2005-05-30'))
AND NR.BM IN(1254,2005,5871,2365,2015,2545,2035,2589,......) --主要问题在这
xspf 2005-05-17
  • 打赏
  • 举报
回复
ADO command对象有一个指定超时时限的CommandTimeout属性,默认是30,是不是可以改长一点。

TempADOCommand->CommandTimeout
真如实观 2005-05-16
  • 打赏
  • 举报
回复
exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
go
--------------------------------------------------
好的,"?"是表对象吗?
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
--试试在你的数据库中,执行下面的语句重建所有索引.


exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
go
真如实观 2005-05-16
  • 打赏
  • 举报
回复
另外,从7.0升级的时候,升级了数据结构是什么意思? 是使用导入/导出重建了库,还是怎么一个结构升级法?
----------------------------------------------------------------------------
EXEC sp_updatestats
真如实观 2005-05-16
  • 打赏
  • 举报
回复
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
---------------------------------
不好意思,我打的是sp3
真如实观 2005-05-16
  • 打赏
  • 举报
回复
打了.
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
另外,从7.0升级的时候,升级了数据结构是什么意思? 是使用导入/导出重建了库,还是怎么一个结构升级法?
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复

检查你的SQL有没有打补丁,没有的话要打上补丁,检查的方法是在查询分析器中运行:
select @@version
如果出来的版本号是8.00.2039以下,则表明你未安装sp4的补丁,要装上.

SQL补丁下载:
全部补丁的位置(在下载页的中间部分,可以选择语言,以下载和sql server实例语言对应的补丁)
http://www.microsoft.com/downloads/details.aspx?FamilyId=8E2DFC8D-C20E-4446-99A9-B7F0213F8BC5&displaylang=zh-cn
应该安装的是
http://download.microsoft.com/download/9/b/f/9bff6646-2cdb-4069-ada0-548be9cb9338/SQL2000-KB884525-SP4-x86-CHS.EXE
注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装


如果你的操作系统是xp,那么在安装xp sp2后,不管以前是否安装过sql sp4,都要再安装一次,并且在防火墙中开启1433端口,否则无法被其他电脑访问


chichunhua 2005-05-16
  • 打赏
  • 举报
回复
你的數據庫打了補丁沒,建議吧補丁打完全
mahf 2005-05-16
  • 打赏
  • 举报
回复
mark
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
语句不用修改,只需要在你的数据库中执行却可.

34,872

社区成员

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

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