0

I just join new organization. They like to put all the logic in stored procedure? May I know is it a good practice in Software Development.

In addition, I found some of stored procedure having some performance issue when increase number of user. For example, it takes some time to run the following stored procedure.

Next, it it good to have multiples join in a stored procedure like following.

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[USP_230_GetMRPByBatch]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[USP_230_GetMRPByBatch]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[USP_230_GetMRPByBatch]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[USP_230_GetMRPByBatch] AS' 
END
GO

ALTER PROCEDURE [dbo].[USP_230_GetMRPByBatch]
    @DIST_CD     NVARCHAR(20),
    @CUST_CD     NVARCHAR(20),
    @WHS_CD  NVARCHAR(20),
    @PRD_CD  NVARCHAR(20),
    @BILL_METHOD    CHAR(1),
    @INV_KEY NVARCHAR(50) = ''
AS
--2017-06-30    Chuah   - Add Available stock summary from INVT_MASTER
--2018-01-02    Chuah   - Add parameter @INV_KEY, need to consider allocated stock for invoice.
BEGIN
    SET NOCOUNT ON;

    DECLARE @COUNTRY_DT DATETIME
    SET @COUNTRY_DT = dbo.GetCountryDate()


    IF OBJECT_ID('tempdb..#BATCH_LOTEXP_PERIOD') IS NOT NULL
        DROP TABLE #BATCH_LOTEXP_PERIOD

    -- Get Batch Exclusion Expiry period    
    SELECT @PRD_CD AS PRD_CD, E.LOTEXP_IND, E.LOTEXP_MTH, 
          CASE B.REF_VALUE3 WHEN 0 THEN 0 
             ELSE ISNULL(J.LOTEXP_DAY,0) END 'LOTEXP_DAY'
    INTO #BATCH_LOTEXP_PERIOD
    FROM MST_CUSTOPTION AS E
    INNER JOIN SET_REF B ON B.DIST_CD = @DIST_CD AND B.REF_TYPE = 'G_WAREHOUSE' AND B.REF_PARAM = @WHS_CD AND B.REF_VALUE2 = 'Y' AND B.REF_VALUE3 = '1'
    OUTER APPLY (
       SELECT TOP 1 C.LOTEXP_DAY 
       FROM MST_LOTEXP C
       INNER JOIN MST_CUSTATTR D ON D.CUST_CD = @CUST_CD AND D.SYNCOPERATION <> 'D'
       INNER JOIN VW_PRD I ON I.PRDCAT_CD = @PRD_CD
       WHERE C.CUSTHIER_LEVEL = D.CUSTHIER_LEVEL AND C.CUSTHIER_CD = D.CUSTHIER_CD
          AND C.PRDCAT_LEVEL = I.PRDCAT_LEVEL AND C.PRDCAT_CD = I.PRDCAT_CD
          AND C.SYNCOPERATION <> 'D'
       ORDER BY CAST(C.PRDCAT_LEVEL AS INT) DESC
    ) AS J
    WHERE E.CUST_CD = @CUST_CD AND E.SYNCOPERATION <> 'D' 
    GROUP BY E.LOTEXP_IND, E.LOTEXP_MTH, B.REF_VALUE3, J.LOTEXP_DAY


    -- Get Batch Expiry date
    IF OBJECT_ID('tempdb..#BATCH_EXPIRY') IS NOT NULL
        DROP TABLE #BATCH_EXPIRY

    SELECT A.PRD_CD, 
       CASE A.LOTEXP_IND WHEN 1 THEN (CASE A.LOTEXP_MTH WHEN 0 
                                    THEN CONVERT(VARCHAR(10), DATEADD(DAY,A.LOTEXP_DAY,CONVERT(VARCHAR(10),@COUNTRY_DT,120)),120)
                                    ELSE CONVERT(VARCHAR(10),DATEADD(MONTH,A.LOTEXP_MTH,CONVERT(VARCHAR(10),@COUNTRY_DT,120)),120) END) 
                          ELSE CONVERT(VARCHAR(10),DATEADD(DAY,A.LOTEXP_DAY,CONVERT(VARCHAR(10),@COUNTRY_DT,120)),120) END EXPIRY_DT
    INTO #BATCH_EXPIRY
    FROM #BATCH_LOTEXP_PERIOD AS A 


    -- Get MRP by batch
    SELECT A.MRP, A.STK_AVAILABLE + ISNULL(F.PRD_QTY, 0) AS STK_AVAILABLE, A.AVAILABLE_STK_MAIN + ISNULL(F.PRD_QTY, 0) AVAILABLE_STK_MAIN  FROM (
        SELECT A.MRP, SUM(A.AVAILABLE_STK) AS STK_AVAILABLE, MAX(E.AVAILABLE_STK) AVAILABLE_STK_MAIN
        FROM INVT_BATCH A
        INNER JOIN INVT_BIN B ON B.DIST_CD = A.DIST_CD AND B.WHS_CD = A.WHS_CD AND B.BIN = A.BIN AND B.SYNCOPERATION <> 'D'
        LEFT OUTER JOIN #BATCH_EXPIRY AS C ON C.PRD_CD = A.PRD_CD
        LEFT OUTER JOIN MST_PRDMRP AS D ON D.DIST_CD = A.DIST_CD AND D.PRD_CD = A.PRD_CD AND D.MRP = A.MRP 
        LEFT OUTER JOIN (
            SELECT DIST_CD, WHS_CD, PRD_CD, SUM(AVAILABLE_STK) AVAILABLE_STK FROM INVT_MASTER       
            WHERE DIST_CD = @DIST_CD AND PRD_CD = @PRD_CD AND WHS_CD = @WHS_CD
            GROUP BY DIST_CD, WHS_CD, PRD_CD
        ) AS E ON E.DIST_CD = A.DIST_CD AND E.PRD_CD = A.PRD_CD AND E.WHS_CD = A.WHS_CD
        WHERE A.DIST_CD = @DIST_CD
           AND A.WHS_CD = @WHS_CD
           and A.PRD_CD = @PRD_CD
           AND CONVERT(VARCHAR(10),A.EXPIRY_DT,120) > ISNULL(C.EXPIRY_DT, CONVERT(VARCHAR(10),@COUNTRY_DT,120))
           --AND A.AVAILABLE_STK > 0
           AND ISNULL(A.ONHOLD_IND,0) = 0
           AND A.SYNCOPERATION <> 'D'
           AND ISNULL(A.MRP,0) <> 0
           AND (@BILL_METHOD = 'A' OR (@BILL_METHOD = 'L' AND D.PRD_CD IS NOT NULL))
        GROUP BY A.DIST_CD, A.WHS_CD, A.PRD_CD, A.MRP
    ) A
    LEFT JOIN (
        SELECT TAXABLE_PRC, SUM(PRD_QTY * B.CONV_FACTOR_SML) PRD_QTY FROM TXN_INVDTL_BIN A
        INNER JOIN MST_PRDUOM B ON A.PRD_CD = B.PRD_CD AND A.UOM_CD = B.UOM_CD AND B.SYNCOPERATION <> 'D'
        WHERE INV_KEY = @INV_KEY AND A.PRD_CD = @PRD_CD AND WHS_CD = @WHS_CD
        GROUP BY TAXABLE_PRC
    ) F ON F.TAXABLE_PRC = A.MRP
    WHERE A.STK_AVAILABLE + ISNULL(F.PRD_QTY, 0) > 0


    DROP TABLE #BATCH_LOTEXP_PERIOD
    DROP TABLE #BATCH_EXPIRY
END








GO
Chan Yoong Hon
  • 1,592
  • 7
  • 30
  • 71
  • Possible duplicate of [What are the pros and cons to keeping SQL in Stored Procs versus Code](https://stackoverflow.com/questions/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code) – user2321864 Feb 27 '18 at 08:51
  • The problem with this question, and with the topic you linked to, @user2321864 ,is that this question s entirely opinion based. The accepted answer on that topic is "Stored Procedures are bad", however, I can name you a lot of names (and quite a few big ones in the SQL Community) that will argue the other way (myself included). – Thom A Feb 27 '18 at 09:54
  • @Larnu, I agree with you that it is opinion based and yes some will sing praises while others will not. I linked to that question so one can view all the answers and comments and then decide for themselves – user2321864 Feb 27 '18 at 10:53

1 Answers1

1

I found some of stored procedure having some performance issue when increase number of user

when stored procedures/any code runs slow, you may need to find the cause by seeing wait stats and execution plan.

Also you said, this happens when load is high,then you need to further check which metric is high..Is it CPU,RAM,IO and start your troubleshooting from there

TheGameiswar
  • 27,855
  • 8
  • 56
  • 94