执行基于参数未按预期评估的存储过程

时间:2017-05-11 15:09:38

标签: sql sql-server

我有一个脚本,当我执行它时似乎转到了错误的条件:

CREATE PROCEDURE [dbo].[Usp_enty_get_by_attr_val] @VALUE VARCHAR(5000)
    ,@ENTY_ID INT
    ,@FIELD_ID INT
AS
BEGIN
    SET NOCOUNT ON;

    IF (
            @ENTY_ID = 13
            AND @FIELD_ID = 425
            )
    BEGIN
        SELECT *
        FROM (
            SELECT cmb.item_id
                ,cmba.field_id
                ,cmba.attr_val
                ,cmba.upd_dtt
                ,cmba.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_member_brg_attr cmba ON (cmb.item_id = cmba.item_id)

            UNION

            SELECT cmb.item_id
                ,ca.field_id
                ,ca.attr_val
                ,ca.upd_dtt
                ,ca.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_attr ca ON (cmb.contract_item_id = ca.item_id)
            WHERE ca.field_id IN (413)

            UNION

            SELECT cmb.item_id
                ,91
                ,m.item_name
                ,m.upd_dtt
                ,m.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_attr ca ON (cmb.contract_item_id = ca.item_id)
            INNER JOIN mfr m ON (ca.attr_val = m.item_pk)
            ) a
    END
    ELSE IF (@ENTY_ID = 13)
    BEGIN
        --DECLARE @VALUE varchar(500) = '482'; 
        DECLARE @CONTRACT_MEMBER_BRG_ATTR_ITEM_IDS TABLE (item_id NVARCHAR(100));

        INSERT INTO @CONTRACT_MEMBER_BRG_ATTR_ITEM_IDS
        SELECT item_id
        FROM [contract_member_brg]
        WHERE member_item_id = @VALUE

        SELECT *
        FROM (
            SELECT cmb.item_id
                ,cmba.field_id
                ,cmba.attr_val
                ,cmba.upd_dtt
                ,cmba.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_member_brg_attr cmba ON (cmb.item_id = cmba.item_id)

            UNION

            SELECT cmb.item_id
                ,ca.field_id
                ,ca.attr_val
                ,ca.upd_dtt
                ,ca.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_attr ca ON (cmb.contract_item_id = ca.item_id)
            WHERE ca.field_id IN (413)

            UNION

            SELECT cmb.item_id
                ,91
                ,m.item_name
                ,m.upd_dtt
                ,m.upd_usr
            FROM contract_member_brg cmb
            INNER JOIN contract_attr ca ON (cmb.contract_item_id = ca.item_id)
            INNER JOIN mfr m ON (ca.attr_val = m.item_pk)
            ) a
        WHERE item_id IN (
                SELECT *
                FROM @CONTRACT_MEMBER_BRG_ATTR_ITEM_IDS
                );
    END
        ELSE IF (@ENTY_ID = 14)
    BEGIN
        SELECT *
        FROM [contract_attr]
        WHERE item_id IN (
                SELECT item_id
                FROM contract_attr
                WHERE field_id = 234
                    AND attr_val in (
                        SELECT attr_val
                        FROM contract_attr
                        WHERE field_id = 234
                            AND attr_val in (select item_pk from mfr where item_id = @VALUE)
                        )
                )
    END
    ELSE IF (@FIELD_ID = 413)
    BEGIN
        SELECT c_413.item_id contract_item_id
            ,c_413.attr_val contract_num
            ,c_234.attr_val supp_no
            ,ma.attr_val supp_name
        FROM contract_attr c_413
        INNER JOIN contract_attr c_234 ON (c_413.item_id = c_234.item_id)
        INNER JOIN mfr_attr ma_supp_no ON (
                c_234.attr_val = ma_supp_no.attr_val
                AND ma_supp_no.field_id = 90
                )
        INNER JOIN mfr_attr ma ON (
                ma_supp_no.item_id = ma.item_id
                AND ma.field_id = 91
                )
        WHERE c_413.field_id = 413
            AND c_234.field_id = 234
            AND c_413.attr_val LIKE '%' + @VALUE + '%';
    END
            -- ELSE IF ( @FIELD_ID = 425 ) 
            --        BEGIN 
            --  SELECT sub.*
            --  FROM (
            --Select, item_id, field_id, attr_val from [CONTRACT_ATTR] where item_id in (select item_id from [CONTRACT_ATTR] where field_id = 326 and attr_val = 'Y')
            --       ) sub
            --      WHERE field_id = 234 or field_id = 413
            --        END
            --       ELSE IF ( @FIELD_ID = 426 ) 
            --        BEGIN 
            --   SELECT sub.*
            --  FROM (
            --Select item_id, field_id, attr_val from [CONTRACT_ATTR] where item_id in (select item_id from [CONTRACT_ATTR] where field_id = 326 and attr_val = 'Y' and item_id IN ( select contract_item_id from contract_member_brg where member_item_id = @VALUE))
            --       ) sub
            --      WHERE field_id = 234 or field_id = 413
            --        END 
    ELSE IF (@FIELD_ID = 416)
    BEGIN
        SELECT TOP 100 cnb.ndc_id
            ,cnb.contract_num_val
            ,cnb.quote_price
            ,CONVERT(VARCHAR(10), cnb.eff_dt, 101) AS 'eff_dt'
            ,CONVERT(VARCHAR(10), cnb.end_dt, 101) AS 'end_dt'
            ,cnb.discount_pct
            ,cnb.rebate_pct
            ,cnb.award_type
            ,cnb.contract_ndc_brg_id
            ,(
                SELECT SUBSTRING((
                            SELECT ',' + gm.item_name AS [text()]
                            FROM GM_PROGRAM gm
                            JOIN [CONTRACT_ATTR] ca ON ca.[ATTR_VAL] = gm.Item_Id
                            WHERE field_id = 239
                                AND ca.item_id = (
                                    SELECT item_id
                                    FROM [CONTRACT_ATTR]
                                    WHERE attr_val = cnb.contract_num_val
                                        AND field_id = 413
                                    )
                            FOR XML PATH('')
                            ), 2, 1000)
                ) AS 'programs'
        FROM [ndc_attr] ndc
        INNER JOIN contract_ndc_brg cnb ON ndc.attr_val = cnb.ndc_id
        WHERE ndc.field_id = 69
            AND cnb.contract_ndc_brg_id IN (
                SELECT contract_ndc_brg_id
                FROM contract_ndc_brg
                JOIN ndc ON contract_ndc_brg.ndc_id = ndc.item_pk
                WHERE item_id = @VALUE
                );
    END
    ELSE IF (
            @ENTY_ID = 4
            AND @FIELD_ID = 427
            OR @FIELD_ID = 143
            )
    BEGIN
        SELECT s.*
        FROM contact_attr s
        INNER JOIN (
            SELECT *
            FROM contact_attr
            WHERE field_id = @FIELD_ID
                AND attr_val = @VALUE
            ) AS attr ON ATTR.ITEM_ID = S.ITEM_ID
    END
    ELSE IF (@ENTY_ID = 1 AND @FIELD_ID = 555)
    BEGIN
        SELECT *
        FROM mfr_attr
    END
    ELSE
    BEGIN
        DECLARE @ENTY_TABLE_NAME VARCHAR(500)

        SET @ENTY_TABLE_NAME = (
                SELECT TOP 1 enty_table_name
                FROM enty
                WHERE enty.enty_id = @ENTY_ID
                )

        EXEC ('SELECT S.*   FROM ' + @ENTY_TABLE_NAME + '_ATTR S' + '   INNER JOIN (      SELECT *   FROM ' + @ENTY_TABLE_NAME + '_ATTR' + '   WHERE FIELD_ID = ''' + @FIELD_ID + ''' AND ATTR_VAL = ''' + @VALUE + ''' ) AS ATTR ON ATTR.ITEM_ID=S.ITEM_ID')
    END
END
GO 

抱歉,这是一个很长的脚本。所以我想要执行的是:

exec [Usp_enty_get_by_attr_val] 13, 91, 1718;
exec [Usp_enty_get_by_attr_val] 13, 425, 1718;

我得到了:

Msg 208, Level 16, State 1, Line 16
Invalid object name '_ATTR'.

我不明白为什么会这样。当我在IF(@ENTY_ID = 13)中分离查询并设置@VALUE = 1718时,我得到了预期的结果。

我做错了什么以及如何解决?

0 个答案:

没有答案