sql 存儲過程記錄


-- exec sp_helptext add_book1

CREATE proc add_book1      --創建存儲過程

 

 

 

@DocCode VARCHAR(30)     --創建參數 

 

 

 

as

 

BEGIN

INSERT INTO book_new_msg (

book_num,

book_msg,

book_name,

book_class,

price,

ware_people,

Docdate,

doctype

)

 

 

SELECT

a.book_num,

a.boo_msg,

a.book_name,

a.book_class,

a.price,

b.ware_people,

b.DocDate,

b.doctype

FROM

BOOK_MSG1 a

INNER JOIN BOOK_WARE1 b ON a.DocCode = b.Doccode

WHERE

a.DocCode = @DocCode

 

 

END

BEGIN

CREATE TABLE #T (book_num INT, book_sum INT)

INSERT INTO #T (book_num, book_sum) 


SELECT

book_num,

SUM (book_count)

FROM

book_msg1

WHERE

DocCode= @DocCode

GROUP BY

book_num 
UPDATE a

SET book_sum = ISNULL(a.book_sum, 0) + b.book_sum

FROM

book_sun a

INNER JOIN #T b ON a.book_num = b.book_num 
 

INSERT INTO book_sun (book_num, book_sum) SELECT

a.book_num,

a.book_sum

FROM

#t a

LEFT JOIN book_sun b ON a.book_num = b.book_num

WHERE

ISNULL(b.book_num, '') = ''

END
View Code

 

 改 存儲過程利用 inner join 和left join 減少了 if else 判斷的操作提高了效率

 

 

 

 

 

/*

    成品出貨日期(取最早)對應 入庫的時間

    fqh  2019-7-2

*/



CREATE    PROCEDURE  USP_PROD_DELIVERY

(

    @begindate        DATETIME,

    @enddate        DATETIME,

    @cltcodehd        VARCHAR(20)  = '',

    @cltnamehd        VARCHAR(100) = '',

    @stcodehd        VARCHAR(20)  = '',

    @stnamehd        VARCHAR(50)  = ''

)

AS

BEGIN



--返回表

CREATE   TABLE  #T

(

    lot_no            VARCHAR(20),

    style            VARCHAR(50),

    modelcode        VARCHAR(50),

    docdate            DATETIME,

    cltcode            VARCHAR(20),

    cltname            VARCHAR(100),

    stcode            VARCHAR(20),

    stname            VARCHAR(50),

    out_qty            INT,

    in_date            VARCHAR(10),

    in_qty            INT

)

CREATE  INDEX  IX_#T_LOT_NO        ON #T(LOT_NO)



INSERT  INTO   #T(lot_no,docdate,stcode,out_qty,in_date,in_qty)



SELECT

    m.refcodeitem,m.out_date,m.stcode,m.out_qty,n.periodid,n.in_qty

FROM

(

-- 取出指令最早出庫時間&累計出庫數

SELECT 

    b.refcodeitem,MIN(a.docdate) AS out_date,a.stcode,SUM(b.basedigit)  AS out_qty

FROM        imatdochd        a WITH(NOLOCK)

INNER  JOIN    imatdocitem        b WITH(NOLOCK)    ON a.doccode   = b.doccode

WHERE 

        a.docdate    >= @begindate

    AND a.docdate   <= @enddate

    AND (@stcodehd    = ''  OR a.stcode = @stcodehd)

    AND (@cltcodehd = ''  OR a.cltcode = @cltcodehd) 

    AND a.formid     = 2444

    AND    a.docstatus  >= 250

    AND LEFT(b.refcodeitem,2) NOT IN('SC')

GROUP BY b.refcodeitem,a.stcode    

) m

INNER  JOIN 

(

-- 取出每次指令入庫時間&數量

SELECT 

    b.refcodeitem,a.periodid,a.stcode,SUM(b.basedigit)    AS  in_qty

FROM

            imatdochd        a WITH(NOLOCK)

INNER JOIN  imatdocitem        b WITH(NOLOCK)  ON a.doccode = b.doccode

WHERE    

        a.formid        = 1001

    AND a.docstatus        >= 100

GROUP BY b.refcodeitem,a.periodid,a.stcode

) n 

ON  m.refcodeitem = n.refcodeitem AND m.stcode = n.stcode 





UPDATE   a

SET    modelcode     = b.modelcode,

       style         = b.style,

       cltname         = b.cltname

FROM   #t  a INNER JOIN  proorderhd  b WITH(NOLOCK) ON a.lot_no = b.predoccode



UPDATE  a

SET    stname = b.stname

FROM  #t a INNER JOIN  ostorage  b WITH(NOLOCK) ON a.stcode = b.stcode 







SELECT  *FROM  #t ORDER BY docdate  ASC  



DROP   TABLE  #T 

END

 

 

使用索引降低查詢速度, 使用聚合函數 獲取查詢內容,  使用select 套select  加inner join 獲取 鏈接數據

 

 

 

 

 

 

update 修改 數據  ,利用     ''update set 字段=from  表  inner join 表 on 字段=字段''                 的方式 進行修改

UPDATE  pc_forecast_mtl_type set  memo=(
SELECT a.memo from   MTL_STORE_AGE_DETAIL_INPUT a INNER JOIN pc_forecast_mtl_type b
on a.mtl_no=b.matcode ) ,
plandate =(
SELECT a.plandate from   MTL_STORE_AGE_DETAIL_INPUT a INNER JOIN pc_forecast_mtl_type b
on a.mtl_no=b.matcode where a.mtl_no=b.matcode

)  


update  a
set memo = b.memo
from  pc_forecast_mtl_type a inner join MTL_STORE_AGE_DETAIL_INPUT b 
on a.matcode = b.mtl_no 
where a.matcode =b.mtl_no
View Code

 

 

 

 

 

insert into  select  的使用 

 

INSERT INTO #t_mtl(vndcode,matcode)

SELECT vndcode,matcode

FROM proprice_sheet 

WHERE (ISNULL(@vndcodehd,'') = '' OR vndcode = @vndcodehd)

  AND (ISNULL(@matcodehd,'') = '' OR matcode = @matcodehd)

  AND ISNULL(check_flag,0) = 1

 

 

 

 

 

 

返回數據 類型結果

/*
   替換核料單里成易料號 為 維濤料號
*/

alter   PROCEDURE   USP_UPT_CY_MTL_NO
   @doccode      VARCHAR(20),
   @memo         VARCHAR(200)  OUTPUT
AS
BEGIN


-- 把成易料號轉成 維濤料號
UPDATE  a 
SET   matcode = b.matcode 
FROM  probomitem  a   INNER JOIN  proimatgeneral b ON a.matcode = cy_code
WHERE  a.doccode = @doccode


--根據維濤料號取得 材料名稱等資料
UPDATE probomitem       
SET   matname = b.matname,      
      colortext = b.color,      
      bomspecial = b.standardmode,      
      baseuom = b.uom,      
      uomrate = b.uomrate,      
      baseuomrate = b.baseuomrate      
FROM probomitem a INNER JOIN proimatgeneral b ON a.matcode = b.matcode      
WHERE a.doccode = @doccode 


--取出成易料號無對應的維濤料號資料
SELECT  @memo = STUFF((SELECT  DISTINCT ','+ a.matcode FROM probomitem a
                       LEFT  JOIN  proimatgeneral b WITH(NOLOCK) ON a.matcode = b.cy_code
                       WHERE doccode = @doccode
          AND ISNULL(b.matcode,'') = ''   for xml path('')),1,1,'')


SET  @memo = @memo + ' 材料未編對應料號!'

SELECT   @memo

END

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM