我有一个脚本,当我执行它时似乎转到了错误的条件:
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时,我得到了预期的结果。
我做错了什么以及如何解决?