教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
编程设计
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · MsSql综合技巧

做一个SQL查询,用了临时表,交叉表,但是有一段不明白含义,是照搬来地,请高手解释下

 
学院最新推荐文章
PS教程推荐
 
『做一个SQL查询,用了临时表,交叉表,但是有一段不明白含义,是照搬来地,请高手解释下』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-8-3 
还请高手指点下,这是一个数据库查询
Set @sTmpDate=@p1BgnDate
While Left(@sTmpDate,7) <=Left(@p2EndDate,7)
Begin
If Exists(Select Name from SysObjects where name='pfSale'+Left(@sTmpDate,4)+SubString(@sTmpDate,6,2)
            and XType='U')

。。。。。。
  End 

  Set @sTmpDate=Convert(Varchar(10),DateAdd(Month,1,@sTmpDate),120)
----原数据库中有pfsaleyyyymm按日期生成的表, @p1bgndate是手动选择的日期
这几句是什么意思我不是非常明白,还请高手解释下,
其中一个很迷惑的问题,当查询日期选择任何5天内的没有什么问题,当查询超过5-8天后,查询就报124行'('语法错误,好像查询数据量一大就出问题,是否与以上的语句有设置不当有关呢,拜托各位解释下
如果需要可以把全部语句放上来

这个问题第1个回答:
SQL code

--加个语句,看看结果是什么,取年月用convert简单

select replace(convert(varchar(7),@sTmpDate,120),'-','')



If Exists(Select Name from SysObjects where name='pfSale'+replace(convert(varchar(7),@sTmpDate,120),'-','') and XType='U') 


这个问题第2个回答:
SQL code

select 'pfSale'+replace(convert(varchar(7),getdate(),120),'-','')








pfSale200808



这个问题第3个回答:
查表是否存在

就这几行代码 看不出报错原因
124行是什么语句呀
这个问题第4个回答:
谢谢wzy_love_sly给的语句,明早去试下,再问下XType='U'是什么意思,好像还有其他参数,这项是做什么用的
这个问题第5个回答:
U = 用户表
这个问题第6个回答:
SQL code

Set @sTmpDate=@p1BgnDate 

While Left(@sTmpDate,7) <=Left(@p2EndDate,7) 

Begin 

If Exists(Select Name from SysObjects where name='pfSale'+Left(@sTmpDate,4)+SubString(@sTmpDate,6,2) 

            and XType='U') 



。。。。。。 

  End  



  Set @sTmpDate=Convert(Varchar(10),DateAdd(Month,1,@sTmpDate),120) 


你这个SET语句是否是放在循环里面的,,,是否是这样?

SQL code



-- 这句是将起始日期赋给一个变量@sTmpDate

Set @sTmpDate=@p1BgnDate 

-- 这句是循环的开始,当变量的值@sTmpDate小于或者等于终止日期@p2EndDate时,执行循环体里面的内容,

-- Left(@sTmpDate,7)是取得@sTmpDate左边的7位,不知道你数据里面存储的是什么类型,通常情况下是取的年月,

-- 这个要检查一下你的数据类型和转换类型才知道,

While Left(@sTmpDate,7) <=Left(@p2EndDate,7) 

Begin 

-- 这句的意思是,查询数据库中是否存在当前的@sTmpDate中拼接的表pfSaleYYYYMM.如果存在,则执行下面的操作,

-- 如果不存在则执行IF后面的操作.

-- name='pfSale'+Left(@sTmpDate,4)+SubString(@sTmpDate,6,2) 这个是拼接形如pfSaleYYYYMM的表,

--  XType='U'标识用户表,这个查询一下sysobjects里面就可以看到对应的类型.

    If Exists(Select Name from SysObjects where name='pfSale'+Left(@sTmpDate,4)+SubString(@sTmpDate,6,2) 

            and XType='U') 

    BEGIN

      。。。。。。

    END

   -- 这是将循环变量赋值,在月份上+1.

    Set @sTmpDate=Convert(Varchar(10),DateAdd(Month,1,@sTmpDate),120) 

End  


 
这个问题第7个回答:
用2楼的方法还是查询超过5-7天时报'('语法错误,我把全部语句放上来,大家看看问题出在哪
解释:用查询时间的条件,生成一个临时表,然后做了个交叉表,按客户信息(CustomerCode)生成一个横向排列的客户信息,结果举例:                张三  张三_1 张三_2    李四 李四_1 李四_2
                  商品1        sjl  mll    zjgj      sjl  mll  zjgj
                商品2
/* 分店商品批发明细表,根据时间、分店查询。
  输入参数: 开始日期
            结束日期
            分店编码
  Created by jjz 2003-02-20
  Modified by Ncj  2004-07-26
*/

Declare @p1BgnDate char(10) --手动输入的日期
Declare @p2EndDate char(10) --手动输入的日期
Declare @p3ShopCode varchar(6)  --店的编号

select @p1BgnDate=:p1BegDate
select @p2EndDate=:p2EndDate
select @p3ShopCode=:p3ShopCode

Declare @sTmpDate char(10)
Declare @sSQL varchar(8000)

/*创建所需的临时表*/
If Exists(Select Name from Tempdb..SysObjects where Name='##TmpShopPfXs' and XType='U')
  Drop table ##TmpShopPfXs
Create table ##TmpShopPfXs
(ShopCode Char(6),PluCode Char(20),accDate Char(10),VendorCode Char(15) null,CustomerCode Char(15),Customername char(30),
pluname char(30),CargoNo char(20) null,DepCode char(8),
PfPrice money,pfCount money,mll money,OJPrice money,sjl money,zjgj money
)
---分别代表,店编号, 商品编号, 单据日期,  供应商编号,  客户编号 ,客户名称,  商品名称, 货号 , 部门编号 ,
批发价, 批发数量 ,毛利率 , 最近进价 ,  顺加率 ,  该客户最近批发价


   
/*统计一段期间内的分店的批发明细数据*/
Set @sTmpDate=@p1BgnDate
While Left(@sTmpDate,7) <=Left(@p2EndDate,7)
Begin
  If Exists(Select Name from SysObjects where name='pfSale'+Left(@sTmpDate,4)+SubString(@sTmpDate,6,2)
            and XType='U')
  Begin
    Set @sSql='Insert into ##TmpShopPfXs(ShopCode,PluCode,accDate,VendorCode,CustomerCode,Customername,
                PfPrice,pfCount,mll,pluname,CargoNo,OJPrice,sjl,zjgj,DepCode)
             

                              Select  s.OrgCode,f.PluCode,accDate,g.VendorCode,t.CustomerCode,p.Customername,
f.PfPrice,pfCount,
case isnull(f.pfprice,0)
when 0 then 100 else (f.pfprice-OJPrice)*100.00/(f.pfprice) end as mll,pluname,CargoNo,OJPrice,case isnull(OJPrice,0) 
---就是 最

[1] [2] 下一页  

】【关闭窗口
·上页:
·下页:
相关文章
 
     数据库类教程 - MsSql综合技巧
普通教程请教一个运用存储过程在数据库中
普通教程CONVERT 小疑难.
普通教程求助SQL语句
普通教程创建视图疑难
普通教程sql server 2000 sp3地安装疑难
普通教程自动增长列导入数据地疑难
普通教程俺是新手,问SQL Server 2005地
普通教程跨数据库 插入数据 地难题 高手
普通教程向主表和子表中同时插入记录怎么
普通教程急啊,麻烦哪位高手帮忙处理!!(乱
普通教程UPDATE语名怎么无效?
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光