sp error:子查询返回的值超过1

时间:2015-08-22 09:39:33

标签: sql-server

这是存储过程

$this->context->smarty->assign( 'varName', 'varValue' );
  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

你有什么好主意吗?

2 个答案:

答案 0 :(得分:1)

只有一个子查询,因此返回多个项目。

你可以通过获得第一项来轻松解决这个问题:

SET @ItemType = (SELECT TOP 1 ItemType ...

但是,您应该考虑为什么子查询返回多个项目,并返回正确的项目。

答案 1 :(得分:0)

您可以尝试这种方式 -

ALTER PROCEDURE [dbo].[spGetMarkdownPlan]
    @MarkdownPlanDate   VARCHAR(10),
    @Memo               VARCHAR(100)

AS
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

--DECLARE @ItemType   VARCHAR(4)
IF OBJECT_ID('tempdb..#ItemType') IS NOT NULL
DROP TABLE #ItemType

CREATE TABLE #ItemType (ItemType VARCHAR(4));

INSERT INTO #ItemType 
SELECT ItemType FROM tblMarkDownPlan 
            WHERE   MarkdownPlanDate    >= CONVERT(SMALLDATETIME, @MarkdownPlanDate)
                AND MarkdownPlanDate    < CONVERT(SMALLDATETIME, @MarkdownPlanDate) + 1
                AND Memo = @Memo;

BEGIN
--IF @ItemType = '0010' -- itemcode
IF EXISTS (SELECT 1 FROM #ItemType WHERE ItemType = '0010') -- itemcode
BEGIN
    SELECT  mdp.Itemcode,
            SectionCode,
            ColorID ='',
            SizeDCode ='',
            CurrentPrice,       
            MarkDownPrice

FROM  tblMarkDownPlan mdp LEFT OUTER JOIN tblMarkDownPlanSection mdps ON (mdp.MarkdownPlanDate = mdps.MarkdownPlanDate AND mdp.Itemcode = mdps.Itemcode AND mdp.Memo = mdps.Memo)
WHERE   mdp.MarkdownPlanDate        >= CONVERT(SMALLDATETIME, @MarkdownPlanDate)
        AND mdp.MarkdownPlanDate            < CONVERT(SMALLDATETIME, @MarkdownPlanDate) + 1
        AND mdp.Memo                = @Memo 
        AND mdp.ItemType = '0010'       
END
ELSE  

SELECT  mdp.Itemcode,
        SectionCode,
        ColorID ,
        SizeDCode ,
        CurrentPrice,       
        MarkDownPrice

FROM    tblMarkDownPlan mdp LEFT OUTER JOIN tblMarkDownPlanSectionSKU mdpsku ON (mdp.MarkdownPlanDate = mdpsku.MarkdownPlanDate AND mdp.Itemcode = mdpsku.Itemcode AND mdp.Memo = mdpsku.Memo)
WHERE   mdp.MarkdownPlanDate        >= CONVERT(SMALLDATETIME, @MarkdownPlanDate)
        AND mdp.MarkdownPlanDate    < CONVERT(SMALLDATETIME, @MarkdownPlanDate) + 1
        AND mdp.Memo                = @Memo
        AND mdp.ItemType != '0010'

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

END