您的位置:首页 > 数据库

收集SQL语句使用技巧!!!

2005-05-22 20:32 615 查看
daxia003 (2001-12-17 17:16) 794281
收集SQL语句使用技巧!!!(只要不是太普通的就行了!带条例子语句!)

一条十分!!!

先到先得!!!
GZCYP (2001-12-17 17:21)
SQL没有技巧,只有经验和学习。
SuperJS (2001-12-17 17:30)
给你一条以前在csdn看到的!
  SELECT DISTINCT SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) AS BGT_TYPE,  
         ( CASE SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ) WHEN "09" THEN "1" WHEN "10" THEN "2"
                                                        WHEN "11" THEN "3" ELSE "9" END ) AS BGT_CLASS,  
         SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 ) AS BGT_TEAM,  

         ( ISNULL( (SELECT SUBSTRING(KMC101.KMC101_NAME,CHARINDEX("-",KMC101.KMC101_NAME)+1,12) FROM KMC101  
                     WHERE ( KMC101.KMC101_TYPE = "BUDGETCODE" )
                       AND ( KMC101.KMC101_CODE = SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) + "00" ) ),"" ) ) AS BGT_NAME,  

         SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) AS BGT_AMT01,  
         SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) AS BGT_AMT02,  
         SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) AS BGT_AMT03,  
         SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) AS BGT_AMT04,  
         SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) AS BGT_AMT05,  
         SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) AS BGT_AMT06,  
         SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) AS BGT_AMT07,  
         SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) AS BGT_AMT08,  
         SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) AS BGT_AMT09,  
         SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) AS BGT_AMT10,  
         SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) AS BGT_AMT11,  
         SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) AS BGT_AMT12,

         ( SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) +
           SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) +
           SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) +
           SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) +
           SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) +
           SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) ) AS AMT01,  
         ( "XXXXXXXX" ) AS AMT02,  

         SUM( ISNULL( ( CASE WHEN ( CONVERT(CHAR(8),KMM102.KMM102_CHK_DATE,112) < "YYYYMMDD" )
                             THEN KMM102.KMM102_CHK_AMT ELSE 0 END ),0 ) ) AS AMT09,  
         SUM( ISNULL( ( CASE WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < "YYYYMMDD" )
                              AND KMM102.KMM102_OVER_STATUS <> "00" )
                             THEN KMM102.KMM102_OVER_AMT
                             WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < "YYYYMMDD" )
                              AND KMM102.KMM102_OVER_STATUS = "00" )
                             THEN KMM102.KMM102_OVER_AMT ELSE 0 END ),0 ) ) AS AMT07,  
         SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < "YYYYMMDD" )
                                     AND KMM103.KMM103_PAY_STATUS <> "2" )
                                    THEN KMM103.KMM103_PAY_AMT ELSE 0 END
                                    FROM KMM103
                                   WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )  
                                     AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )  
                                     AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT03,  
         SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < "YYYYMMDD" )
                                     AND KMM103.KMM103_PAY_STATUS <> "1" )
                                    THEN KMM103.KMM103_PAY_AMT ELSE 0 END
                                    FROM KMM103
                                   WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )  
                                     AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )  
                                     AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT04  
    FROM KMM102,  
         KMM101  
   WHERE ( KMM102.KMM102_YY = "YYY" ) AND
         ( KMM102.KMM102_BGT_KIND = "1" ) AND
         ( KMM101.KMM101_YY =* KMM102.KMM102_YY ) AND
         ( KMM101.KMM101_BGT_KIND =* KMM102.KMM102_BGT_KIND ) AND
         ( KMM101.KMM101_BGT_TYPE =* KMM102.KMM102_BGT_TYPE )
GROUP BY SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ),  
         SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ),  
         SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 )  
ORDER BY BGT_CLASS ASC,  
         BGT_TYPE DESC  
;
我这条如果只给10分是不是太少了!
大多数用select可能遇到的都遇到了!
bbs_delphi (2001-12-17 17:28)
gz
Zane (2001-12-17 17:29)
具体问题,具体分析
坛子 (2001-12-17 17:33)
Advanced SQL Code Collection v1.2.0  

Powerful editor that enables you to write your SQL scripts efficiently. It includes SQL
syntax highlighting, large base of SQL code templates, power search engine and convenient
bookmarks
风中流云 (2001-12-17 17:52)
agree zane
kals (2001-12-17 19:15)
一条两百分还差不多
sxbing (2001-12-17 23:4)
select * from *
hwchen (2001-12-17 23:20)
select * into #tmp from *
drop #tmp
marknew (2001-12-18 9:6)
select * from *   --》这是什么东东呀?乱讲.
看下我的存贮过程吧,里面还有很多技巧.
CREATE PROCEDURE PickDelta
       @pick_num         char(14),
       @prepare_by       varchar(20),
       @lcInitShipMaxNo  varchar(20),
       @lcInitSalesMaxNo varchar(20),
       @ship_date        datetime,
       @GenNewSales      varchar(200)='' output,
       @GenNewShips      varchar(200)='' output,
       @Have_ship        boolean=0 output      
AS
declare @affect_row integer,@temp_store_qty  integer
declare @DtempSeq_no tinyint,@Dtempproduct_code char(10),@Dtempvdr_id char(4),@Dtempstore_id char(6),@Dtempship_qty int
declare @i tinyint,@err_msg varchar(200),@Err_salesTitle varchar(100),@Have_LessSale  bit
declare @c_id char(8),@tran_ltd varchar(80),@rec_acc_status char(1)
declare @TempStr varchar(20)
select  @affect_row=0
select  @Have_ship=0
select  @i=0
SET NOCOUNT ON
if exists (select * from tempdb.dbo.sysobjects where name ="##temp_store")
begin
         drop table ##temp_store
end
--得到本张检货单用到的所有的配件的库存临时表##temp_store
select * into ##temp_store from info_part_store where product_code+vdr_id+store_id in (select product_code+vdr_id+store_id
                                                                 from pick_detail where pick_num=@pick_num)
if @@rowcount<=0
begin
   raiserror('在库存中没有找到任何配件,请确认这张捡货单是否有效',16,1)
   return
end
begin transaction  
--定义所有客户游标cursor_client
select cursor_status('local','cursor_client')
if cursor_status('local','cursor_client')>0
begin
   CLOSE cursor_client
   DEALLOCATE cursor_client
end
declare cursor_client Cursor local For
        select distinct a.c_id,isnull(b.tran_ltd,'') as tran_ltd,isnull(b.rec_acc_status,'') as rec_acc_status
                        from pick_detail a left join sales_title b on b.sales_no=a.sales_no where a.pick_num=@pick_num
Open cursor_client
-- 取出一个客户
Fetch Next From cursor_client into   @c_id,@tran_ltd,@rec_acc_status
While @@Fetch_Status=0
begin
   --依据每个不同的客户生成新的出库单  
   if exists (select * from tempdb.dbo.sysobjects where name ="##temp_pick")
   begin
         drop table ##temp_pick
   end
   --生成临时表的序号无论库存够与否都要生成出库单,如果所有对应的库存都是0或者没有找到对应的库位则不生成
   select a.pick_num,a.seq_no into ##temp_pick from pick_detail a  
        left join info_part_store b on b.product_code=a.product_code and b.store_id=a.store_id and b.vdr_id=a.vdr_id<
11747
br />        where pick_num=@pick_num and a.c_id=@c_id  and a.ship_qty>0 and b.store_qty>0
   --如果有数据可以生成出库单的话
   if @@rowcount>0
   begin            
      select @Have_Ship=1      --有数据可以生成出库单
      --定义当前客户的临时游标
     if cursor_status('local','cursor_pick_detail')>0
     begin
          CLOSE cursor_pick_detail
          DEALLOCATE cursor_pick_detail
     end
      Declare cursor_pick_detail Cursor local For
             select seq_no,product_code,vdr_id,store_id,ship_qty from pick_detail where pick_num=@pick_num and c_id=@c_id
                                                                      order by product_code,vdr_id,store_id
      Open cursor_pick_detail
      --取出每一行的检货值
      Fetch Next From cursor_pick_detail  into  @DtempSeq_no,@Dtempproduct_code,@Dtempvdr_id,@Dtempstore_id,@Dtempship_qty
      While @@Fetch_Status=0
      begin
         --得到对应的库存数量
         select @temp_store_qty=(select top 1 store_qty from ##temp_store
                                where product_code=@DtempProduct_code and vdr_id=@Dtempvdr_id and store_id=@Dtempstore_id)
         --库存数量不为空
         if @temp_store_qty is not null and @temp_store_qty>0
         begin
            --生成出库单明细资料          
             select @i=@i+1
             insert ship_detail select @lcInitShipMaxNo,@i,a.product_code,a.vdr_id,a.vdr_short,a.chinese_name,
                 a.meter_unit,a.model_no,
                 case
                        when a.ship_qty>@temp_store_qty then @temp_store_qty
                                                        else a.ship_qty
                 end,
                 b.ref_sale_price,a.store_id,0,
                  '检货单号:'+a.pick_num+'行号:'+convert(varchar(10),a.seq_no) from  pick_detail a
                 left join info_moto_part  b on b.product_code=a.product_code      
                 where  a.pick_num=@pick_num and a.seq_no=@DtempSeq_No
                 if @@error<>0
                 begin
                     select @Err_msg="生成的出库单"+@lcInitShipMaxNo+"明细时出错"
                     raiserror(@Err_msg,16,1)
                     rollback transaction
                  end          
 
                 --修改对应订单的完成数量            
                 update sales_detail set cmp_qty=
                            case  
                             when b.ship_qty>@temp_store_qty then @temp_store_qty
                                                                else b.ship_qty
                             end
                             from sales_detail a,pick_detail b where b.sales_no=a.sales_no and b.sales_seq_no=a.seq_no                
        end--处理当前客户每一行的捡货数量
        Fetch Next From cursor_pick_detail into  @DtempSeq_no,@Dtempproduct_code,@Dtempvdr_id,@Dtempstore_id,@Dtempship_qty
     end--得到当前客户下一行的捡货数据
     --生成出库单标题资料            
     if @Have_Ship=1
      begin
         --定义所有订单号游标cursor_sales        
         declare @AllSalesNo varchar(300)
         declare @DtempSalesNo varchar(20)
         select  @AllSalesNo=''
         if cursor_status('local','cursor_sales')>0
         begin
            CLOSE cursor_sales  
            DEALLOCATE cursor_sales  
          end
         declare cursor_sales   Cursor local For        
                   select distinct sales_no from pick_detail where pick_num=@pick_num
         open cursor_sales
         Fetch Next From cursor_sales  into  @DtempSalesNo
         While @@Fetch_Status=0
         begin
            if @AllSalesNo=''
               select  @AllSalesNo= "'"+@DtempSalesNo+"'"
            else
               select  @AllSalesNo= "'"+@AllSalesNo+"',"+@DtempSalesNo
            Fetch Next From cursor_sales  into  @DtempSalesNo
         end
         CLOSE cursor_sales  
         DEALLOCATE cursor_sales  
         insert into ship_title(flow_num,ship_num,ship_date,c_id,tran_ltd,ship_type_id,rec_acc_status,ship_status,prepare_by,remark,sales_no)
                    values(@pick_num,@lcInitShipMaxNo,@ship_Date,@c_id,@tran_ltd,'00',@rec_acc_status,'未审',@prepare_by,'检货单号:'+@pick_num,@AllSalesNo)
         if @@error<>0
         begin
               select @Err_msg="生成的出库单"+@lcInitShipMaxNo+"标题时出错"
               raiserror(@Err_msg,16,1)
               rollback transaction
        end
        select @GenNewShips=@GenNewShips+char(13)+@lcInitShipMaxNo
        select @TempStr=substring(@lcInitShipMaxNo,1,8)
        select @lcInitShipMaxNo=convert(int,substring(@lcInitShipMaxNo,9,4))+1
        select @lcInitShipMaxNo=@TempStr+replicate("0",4-len(convert(varchar(10),@lcInitShipMaxNo)))+convert(char(4),@lcInitShipMaxNo)
      end
      end --处理当前客户的捡货出库情况
      --依据每个不同的客户生成新的缺货订单
      if exists (select * from tempdb.dbo.sysobjects where name ="##temp_sales")
      begin
         drop table ##temp_sales
      end              
      select @lcInitSalesMaxNo as sales_no,IDENTITY(int,1,1) as seq_no,a.product_code,a.vdr_id,a.vdr_short,a.chinese_name,a.meter_unit,a.model_no,
           abs(isnull(b.store_qty,0)-sum(ship_qty)) as sales_qty,0 as cmp_qty,'缺货检货单;'+a.pick_num as remark into ##temp_sales from pick_detail a
           left join ##temp_store b on b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id
           where a.pick_num=@pick_num and c_id=@c_id group by a.product_code,a.chinese_name,a.meter_unit,a.model_no,a.vdr_id,
           a.vdr_short,b.store_qty,a.pick_num having isnull(b.store_qty,0)-sum(a.ship_qty)<0
           if @@rowcount>0
           begin
               select  @Have_LessSale=1
               insert  sales_detail select * from ##temp_sales
               if @@error<>0
                  begin
                     select @Err_salesTitle ="生成缺货订单的标题"+@lcInitSalesMaxNo+"出错"
                     raiserror(@Err_salesTitle,16,1)
                     rollback transaction
                  end
               insert  into sales_title(sales_no,c_id,c_short,sales_date,ship_type_id,po_status,remark) select
                       @lcInitSalesMaxNo,@c_id,c_short,getdate(),'00','未完','由检货单'+@pick_num+'生成' from info_client where c_id=@c_id
               if @@error<>0
                   begin
                       select @Err_salesTitle ="生成缺货订单的明细"+@lcInitSalesMaxNo+"出错"
                       raiserror(@Err_salesTitle,16,1)
                       rollback transaction
                   end
       
               select @GenNewSales=@GenNewSales+char(13)+@lcInitSalesMaxNo
               
               select @TempStr=substring(@lcInitSalesMaxNo,1,8)
               select @lcInitSalesMaxNo=convert(int,substring(@lcInitSalesMaxNo,9,4))+1
               select @lcInitSalesMaxNo=@TempStr+replicate("0",4-len(convert(varchar(10),@lcInitSalesMaxNo)))+convert(char(4),@lcInitSalesMaxNo)
               select @lcInitSalesMaxNo
           end
            --依据每个不同的客户生成新的缺货订单
           
            --修改临时表的对应的配件的库存数量
            update ##temp_store set store_qty=
                   case
                        when isnull(b.ship_qty,0)>store_qty then 0
                                                            else store_qty-isnull(b.ship_qty,0)
                        end
            from ##temp_store a
            left join pick_detail b on b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id  
                                    and b.pick_num=@pick_num and b.c_id=@c_id          
   Fetch Next From cursor_client into  @c_id,@tran_ltd,@rec_acc_status
end-- 处理下一个客户
 --修改实际库存数量
update info_part_store set store_qty=isnull(b.store_qty,0)
       from  info_part_store a,##temp_store b
       where b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id      
--修改相应的订单状态
Update sales_title set po_status="出库" where sales_no in
                   (select distinct sales_no from pick_detail where pick_num=@pick_num)
--修改检货单状态
update pick_title set pick_status="审核" where pick_num=@pick_num
if cursor_status('local','cursor_client')>0
begin
   CLOSE cursor_client
   DEALLOCATE cursor_client
end
if cursor_status('local','cursor_pick_detail')>0
begin
   CLOSE cursor_pick_detail
   DEALLOCATE cursor_pick_detail
end
commit transaction
浩毛 (2001-12-18 9:18)
太多了
if exists (select * from dbo.sysobjects where id = object_id('jltmp_单位基本情况表'))
  drop table dbo.jltmp_单位基本情况表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_单位基本情况表2'))
  drop table dbo.jltmp_单位基本情况表2
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统单位类别字典表'))
  drop table dbo.jltmp_系统单位类别字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统经济性质字典表'))
  drop table dbo.jltmp_系统经济性质字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统片区字典表'))
  drop table dbo.jltmp_系统片区字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_IncreNumber'))
  drop function dbo.jltmp_IncreNumber
if exists (select * from dbo.sysobjects where id = object_id('jltmp_整理数据'))
  drop procedure dbo.jltmp_整理数据
if exists (select * from dbo.sysobjects where id = object_id('jltmp_整理数据2'))
  drop procedure dbo.jltmp_整理数据2
if exists (select * from dbo.sysobjects where id = object_id('jltmp_添加数据'))
  drop procedure dbo.jltmp_添加数据
if exists (select * from dbo.sysobjects where id = object_id('dbo.jltmp_许可证编号转换'))
drop function dbo.jltmp_许可证编号转换
GO

create function dbo.jltmp_许可证编号转换
(
  @psNumber varchar(100),
  @len int
)
RETURNS varchar(100) AS
BEGIN
declare @sNewNumber varchar(100),
        @iPos int
 if @psNumber is null select @sNewNumber=null --返回null
  else
  begin
    select @psNumber=ltrim(rtrim(@psNumber))
    select @iPos=len(@psNumber)
    --小于等于10为的许可证编码不变
if @iPos=0 select @sNewNumber=null --空格返回null
else begin
     if @iPos<=10 select @sNewNumber=@psNumber
     else begin
select @sNewNumber=substring(@psNumber,(@len+1),(@iPos-@len))
if len(ltrim(rtrim(@sNewNumber)))<>@iPos-@len select @sNewNumber=null
     end
end
  end
  return @sNewNumber
END
GO

create table dbo.jltmp_单位基本情况表
(
  申请编号 varchar(40) null,
  单位名称 varchar(100) null,
  单位类别 varchar(60) null,
  经济性质 varchar(60) null,
  地址 varchar(100) null,
  电话 varchar(60) null,
  法人或法人代表 varchar(60) null,
 -- 负责人 varchar(60) null,
  经营范围 varchar(80) null,
  主管部门 varchar(60) null,
  职工人数 int null,
  从业人员数 int null,
  建档日期 datetime null,
  卫生许可证号 varchar(60) null,
  卫生卡号 varchar(60) null,
  片区 varchar(60) null,
  操作日期 datetime null,
  状态 varchar(60) null,
  年度评价 varchar(255) null,
  应体检日期 datetime null,
  下次定期监测日期 datetime null,
  档案编号 varchar(60) null,
  卫生种类 varchar(60) null,
  助记符 varchar(60) null,
  有效开始日期 datetime null,
  有效截止日期 datetime null,
  最后复验日期 datetime null
)

create table dbo.jltmp_单位基本情况表2
(
申请编号 UDT_申请编号 not null,
档案编号 UDT_档案编号 not null,
单位名称 varchar(80) null,
法人代表 varchar(20) null,
经济性质 varchar(20) null,
片区 varchar(20) null,
地址 varchar(80) null,
街道 varchar(20) null,
电话 varchar(20) null,
职工人数 int null,
从业人数 int null,
卫生种类 varchar(10) null,
行业类别 varchar(40) null,
经营内容 varchar(80) null,
主管单位 varchar(60) null,
应体检人数 int null,
已体检人数 int null,
卫生许可证号 char(10) null,
助记符 varchar(40) null,
建档日期 datetime not null,
有效开始日期 datetime null,
有效截止日期 datetime null,
最后复验日期 datetime null
)

create table dbo.jltmp_系统单位类别字典表
(
  编号 varchar(20) null,
  内容 varchar(60) null,
  卫生种类 varchar(20) null
)
create table dbo.jltmp_系统经济性质字典表
(
  编号 varchar(20) null,
  内容 varchar(60) null
)
create table dbo.jltmp_系统片区字典表
(
  编号 varchar(20) null,
  内容 varchar(60) null
)
GO

create function dbo.jltmp_IncreNumber
(
  @psNumber varchar(100)
)
RETURNS varchar(100) AS
BEGIN

  declare @sNewNumber varchar(100),@iPos int

  if @psNumber is null select @sNewNumber='01'
  else begin
    select @iPos=len(@psNumber)
    while @iPos>0 and substring(@psNumber,@iPos,1)>='0' and substring(@psNumber,@iPos,1)<='9'
      select @iPos=@iPos - 1
    if @iPos>0 begin
      select @sNewNumber=substring(@psNumber,1,@iPos)
      select @psNumber=substring(@psNumber,@iPos+1,len(@psNumber) - @iPos) end
    else select @sNewNumber=''
    select @iPos=len(@psNumber)
    select @psNumber=rtrim(ltrim(str(convert(int, @psNumber)+1)))
    -- @iPos may < len(@psNumber), for example, @psNumber = '9' + 1 -> '10'
    --because replace(' ',space(<=0), '0')=' ', so
    if @iPos<=len(@psNumber) select @sNewNumber=@sNewNumber+@psNumber
    else select @sNewNumber=@sNewNumber+replace(space(@iPos -len(@psNumber)),' ', '0')+@psNumber
  end
  return @sNewNumber
END
GO

create procedure dbo.jltmp_整理数据2 as
BEGIN
set nocount on

  --添加字典数据
  delete jltmp_系统单位类别字典表
  insert into jltmp_系统单位类别字典表 select distinct null,单位类别,卫生种类 from jltmp_单位基本情况表 where 单位类别 is not null
  delete jltmp_系统片区字典表
  insert into jltmp_系统片区字典表 select distinct null,片区 from jltmp_单位基本情况表 where 片区 is not null
  delete jltmp_系统经济性质字典表
  insert into jltmp_系统经济性质字典表 select distinct null,经济性质 from jltmp_单位基本情况表 where 经济性质 is not null

  --经济性质升级与防疫26一致
  update jltmp_单位基本情况表 set 经济性质 = case
      when 经济性质 in ('国有','集体','私营') then 经济性质 + '企业'
      when 经济性质 = '股份制' then '股份企业'
      else 经济性质
    end
  update jltmp_系统经济性质字典表 set 内容 = case
      when 内容 in ('国有','集体','私营') then 内容 + '企业'
      when 内容 = '股份制' then '股份企业'
      else 内容
    end
  --升级单位类别
  update jltmp_单位基本情况表
set 单位类别 = case
when 单位类别 ='糕点 蜜饯' then '糕点,蜜饯'
else replace(单位类别,' ','')
  end
  update jltmp_系统单位类别字典表
set 内容 = case
when 内容 = '糕点 蜜饯' then '糕点,蜜饯'
        else replace(内容,' ','')
  end

--select distinct 单位类别 from jltmp_单位基本情况表
END
GO

create procedure dbo.jltmp_整理数据 as
BEGIN
set nocount on
  --删除重复单位
  delete jltmp_单位基本情况表 from jltmp_单位基本情况表 a,单位档案_单位基本信息表 b
    where a.单位名称=b.单位名称 and a.片区=b.片区 and a.卫生种类=b.卫生种类 and a.经济性质=b.经济性质 and a.单位类别=b.行业类别

  --删除已存在的单位类别
  delete jltmp_系统单位类别字典表 from jltmp_系统单位类别字典表 a,系统管理_字典_字典内容表 b
    where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('行业属性字典') and
          b.Parent = (select InnerID from 系统管理_字典_字典内容表
                       where ID=dbo.系统管理_获取字典类别ID('行业属性字典') and
                             名称=a.卫生种类 and Parent=0)
  --删除已存在的片区
  delete jltmp_系统片区字典表 from jltmp_系统片区字典表 a,系统管理_字典_字典内容表 b
    where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('片区街道字典') and Parent=0
  --删除已存在的经济性质
  delete jltmp_系统经济性质字典表 from jltmp_系统经济性质字典表 a,系统管理_字典_字典内容表 b
    where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('经济性质字典') and Parent=0

  --处理片区为null的单位
  if exists (select * from jltmp_单位基本情况表 where 片区 is null)
  begin
    update jltmp_单位基本情况表
set 片区 ='<未定>'
where 片区 is null
    insert into jltmp_系统片区字典表 values(null,'<未定>')
  end
    --处理经济性质为null的单位
  if exists (select * from jltmp_单位基本情况表 where 经济性质 is null)
  begin
    update jltmp_单位基本情况表
set 经济性质 ='<未定>'
where 经济性质 is null
    insert into jltmp_系统经济性质字典表 values(null,'<未定>')
  end
  --处理建档日期为null的单位,更改为当前日期
  if exists (select * from jltmp_单位基本情况表 where 建档日期 is null)
  begin
  update jltmp_单位基本情况表
set 建档日期=getdate()
where 建档日期 is null
  end
 
END
GO

create procedure dbo.jltmp_添加数据 as
BEGIN
set nocount on
declare
  @申请编号 varchar(40),@单位名称 varchar(100),@单位类别 varchar(60),@经济性质 varchar(60),
  @地址 varchar(100),@电话 varchar(60),@法人或法人代表 varchar(60),@负责人 varchar(60),
  @经营范围 varchar(60),@主管部门 varchar(60),@职工人数 int,@从业人员数 int,
  @建档日期 datetime,@卫生许可证号 varchar(60),@片区 varchar(60),@档案编号 varchar(60),
  @卫生种类 varchar(60),@助记符 varchar(60),@编号 varchar(60),@内容 varchar(60),
  @ID varchar(20),@InnerID int,
  @有效开始日期 datetime,
  @有效截止日期 datetime,
  @最后复验日期 datetime

--逐个添加经济性质
declare cur经济性质 cursor for select distinct 内容 from jltmp_系统经济性质字典表
open cur经济性质
fetch cur经济性质 into @内容
select @ID=dbo.系统管理_获取字典类别ID('经济性质字典')
select @编号=isnull(max(编号),'00') from 系统管理_字典_字典内容表 where ID=@ID
while @@fetch_status=0 begin
  select @编号=dbo.jltmp_IncreNumber(@编号)
  insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',0)
  fetch cur经济性质 into @内容
end
deallocate cur经济性质
--逐个添加片区
declare cur片区 cursor for select distinct 内容 from jltmp_系统片区字典表
open cur片区
fetch cur片区 into @内容
select @ID=dbo.系统管理_获取字典类别ID('片区街道字典')
select @编号=isnull(max(编号),'00') from 系统管理_字典_字典内容表 where ID=@ID
while @@fetch_status=0 begin
  select @编号=dbo.jltmp_IncreNumber(@编号)
  insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',0)
  select @InnerID=max(InnerID) from 系统管理_字典_字典内容表
  insert into 系统管理_字典_字典内容表 values(@ID,@编号+'01','<未定>','','<防疫25升级到26单位档案导入>',@InnerID)
  fetch cur片区 into @内容
end
deallocate cur片区

--逐个添加单位类别
declare cur单位类别 cursor for select distinct 内容,卫生种类 from jltmp_系统单位类别字典表
open cur单位类别
fetch cur单位类别 into @内容,@卫生种类
select @ID=dbo.系统管理_获取字典类别ID('行业属性字典')
while @@fetch_status=0 begin
  select @InnerID=InnerID from 系统管理_字典_字典内容表
   where ID=@ID and 名称=@卫生种类 and Parent=0
  select @编号=dbo.jltmp_IncreNumber(isnull(max(b.编号),max(a.编号)+'00'))
    from 系统管理_字典_字典内容表 a left join 系统管理_字典_字典内容表 b on b.Parent = a.InnerID
   where a.ID=@ID and a.名称=@卫生种类 and a.Parent=0
  insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',@InnerID)
  select @InnerID=max(InnerID) from 系统管理_字典_字典内容表
  insert into 系统管理_字典_字典内容表 values(@ID,@编号+'0','单位类别','','<防疫25升级到26单位档案导入>',@InnerID)
  insert into 系统管理_字典_字典内容表 values(@ID,@编号+'1','经营形式','','<防疫25升级到26单位档案导入>',@InnerID)
  insert into 系统管理_字典_字典内容表 values(@ID,@编号+'2','许可项目','','<防疫25升级到26单位档案导入>',@InnerID)
  fetch cur单位类别 into @内容,@卫生种类
end
deallocate cur单位类别

--逐个添加单位信息
declare cur单位基本情况表 cursor for
  select distinct 单位名称,单位类别,经济性质,地址,电话,法人或法人代表,经营范围,主管部门,建档日期,
           职工人数,从业人员数,卫生许可证号,片区,卫生种类,助记符,有效开始日期,有效截止日期,最后复验日期
    from jltmp_单位基本情况表
open cur单位基本情况表
fetch cur单位基本情况表 into @单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
  @建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,@助记符,@有效开始日期,@有效截止日期,@最后复验日期
while @@fetch_status=0 begin

  exec 系统管理_返回编号流水号 '单位档案管理','申请编号',@申请编号 output,Null

  select @编号=编号 from 系统管理_字典_字典内容表 a,系统管理_字典_字典表列表 b
   where a.ID=b.ID and b.名称='行业属性字典' and a.名称=@卫生种类

  --以下暂时用 @编号 存储卫生种类的ID
  --参考存储过程 单位档案_生成档案编号
  declare @代号 char(5)
  declare @编号类型 varchar(10)
  if exists(select * from dbo.单位档案_档案编号使用情况表 where substring(档案编号,1,1) = @编号)
  begin
    select @档案编号 =min(CONVERT(int,档案编号)) from dbo.单位档案_档案编号使用情况表
      with (holdlock)
     where substring(档案编号,1,1) = @编号
    delete from dbo.单位档案_档案编号使用情况表 where 档案编号 = @档案编号
  end
  else
  begin
    set @编号类型='档案编号' + @编号
    exec 系统管理_返回编号流水号 '单位档案管理',@编号类型,@代号 output,null
    set @档案编号 = @编号 + @代号
  end

  insert into jltmp_单位基本情况表2(单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
    建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数,有效开始日期,有效截止日期,最后复验日期)
   values(@单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
    @建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,'<未定>',@申请编号,@档案编号,@助记符,0,0,@有效开始日期,@有效截止日期,@最后复验日期)    

  fetch cur单位基本情况表 into @单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
    @建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,@助记符,@有效开始日期,@有效截止日期,@最后复验日期
end
deallocate cur单位基本情况表

  insert into 单位档案_单位基本信息表
(单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
    建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数)
  select 单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
    建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数
  from jltmp_单位基本情况表2

END

--delete dbo.单位档案_单位基本信息表
--delete dbo.许可证_使用信息表
--select a.申请编号,a.单位名称,a.卫生许可证号,a.卫生种类,a.建档日期,a.有效截止日期,a.有效开始日期,a.最后复验日期 from jltmp_单位基本情况表2 a where isnull(a.卫生许可证号,'')<>'' and a.申请编号 not in (select b.申请编号 from 许可证_使用信息表 b)
--select * from dbo.单位档案_单位基本信息表
--select * from dbo.jltmp_单位基本情况表2
浩毛 (2001-12-18 9:20)
还有,嘻嘻

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE    PROCEDURE 检验管理_自动评价
@p收检编号 VARCHAR ( 20 ) = '2001073101100003'
AS

set nocount on
declare @l返回值   varchar(2000),
@l单一样品评价 varchar(500),
@l样品数 int,
@l合格数 int, /*某一样品检验为合格的项目数*/
@l不合格数 int, /*某一样品检验为不合格的项目数*/
@l检验项目数   int, /*记录某单一样品的检验项目数*/
@li  int,  /*用于控制循环次数的变量*/
@lj  int,  /*用于控制循环次数的变量*/
    @l检验结论 varchar(20)

/*建临时表并添入数据,用于记录本次收检的所有样品和每一样品的检验依据,检验结论。*/
select IDENTITY(int) as ID,a.样品名称,a.检验依据,a.检验结论,a.收检编号,a.样品系统编号
into #样品检验信息表
from 检验管理_收检样品信息表 a
where @p收检编号 = 收检编号

/*建临时表,用于记录样品的所有检验项目的检验结果信息.*/
create table #检验项目记录表(ID int IDENTITY,
收检编号 varchar(20),
样品系统编号 varchar(20),
项目名称 varchar(50),
单项结论 varchar(10))

select @li = 1, @l样品数 = max(ID),@l返回值 = '' from #样品检验信息表

while(@li <= @l样品数)
begin
truncate table #检验项目记录表

/*取出并记录下当前样品的检验项目及其结论*/
insert into #检验项目记录表(收检编号,样品系统编号,项目名称,单项结论)
select a.收检编号,a.样品系统编号,c.名称 as 项目名称,a.单项结论
from 检验管理_样品检验项目结果表 a,#样品检验信息表 b,系统管理_检验项目字典视图 c
where a.收检编号 = b.收检编号 and
a.样品系统编号 = b.样品系统编号 and
a.检验项目编号 = c.编号 and
b.ID = @li
order by a.单项结论

select @lj = 1,
@l检验项目数 = max(ID)
from #检验项目记录表

/*检查是否所有的项目都已检验完成(已下检验结论)*/
set @l合格数 = (select count(*) from #检验项目记录表 where 单项结论 = '合格')
set @l不合格数 = (select count(*) from #检验项目记录表 where 单项结论 = '不合格')
if (@l合格数 + @l不合格数 != @l检验项目数)
begin
-- RAISERROR('检验还没完成,不能自动评价',16,1)
-- return -1
set @l合格数 = @l检验项目数 - @l不合格数
end

/*拼自动评价字串*/
select @l单一样品评价 = '依据“' + 检验依据  + '”(标准、规范),' + 样品名称 + '经检测,其中所检 '
from #样品检验信息表 where ID = @li

while(@lj <= @l合格数)  /*拼出合格的检验项目*/
begin
set @l单一样品评价 =ltrim(rtrim( @l单一样品评价)) + (select 项目名称 from #检验项目记录表 where @lj = ID)
  + ','

set @lj = @lj + 1
end

if(@l合格数 > 0)
set @l单一样品评价 = left(@l单一样品评价,len(@l单一样品评价) - 1) + '等项符合标准,'

while(@lj <= @l检验项目数)   /*拼出不合格的检验项目*/
begin
set @l单一样品评价 = @l单一样品评价 + (select 项目名称 from #检验项目记录表 where @lj = ID)
 + convert(varchar(4),@lj) + ','

set @lj = @lj + 1
end

if(@l不合格数 > 0)
set @l单一样品评价 = left(@l单一样品评价,len(@l单一样品评价) - 1) + '等几项不符合标准,'

/*征对一个样品的所有检验项目下一个评价*/
set @l检验结论 = isnull((select 检验结论 from #样品检验信息表 where @li = ID),'合格')

if len(ltrim(@l检验结论)) = 0
set @l检验结论 = '合格'
set @l单一样品评价 = @l单一样品评价 + '判为' + @l检验结论
 + '。' + char(13) + char(10)

set @l返回值 = @l返回值 + @l单一样品评价

set @li = @li + 1
end

/*删除用过的监时表*/

select @l返回值 as 检验评价

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
zs (2001-12-18 9:30)
gz
cfx (2001-12-19 19:14)
ASC,min,max,
sunstring ,getdate, 还有好多的东西,
最好去搞本SQL
书去看看里面一般都有的
coolbaby (2001-12-19 20:0)
学习中
daxia003 (2001-12-20 0:26)
谢谢各位回答
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息