Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sp错误:子查询返回的值超过1_Sql Server - Fatal编程技术网

Sql server sp错误:子查询返回的值超过1

Sql server sp错误:子查询返回的值超过1,sql-server,Sql Server,下面是存储过程 ALTER PROCEDURE [dbo].[spGetMarkdownPlan] @MarkdownPlanDate VARCHAR(10), @Memo VARCHAR(100) AS SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; DECLARE @ItemType VARCHAR(4) SET @ItemType = (SELECT

下面是存储过程

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

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

DECLARE @ItemType   VARCHAR(4)
SET @ItemType = (SELECT ItemType FROM tblMarkDownPlan 
            WHERE   MarkdownPlanDate    >= CONVERT(SMALLDATETIME, @MarkdownPlanDate)
                AND MarkdownPlanDate    < CONVERT(SMALLDATETIME, @MarkdownPlanDate) + 1
                AND Memo = @Memo);

BEGIN
IF @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'

END
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


您有什么好主意吗?

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

您可以通过获取第一个项目轻松解决此问题:

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

但是,您应该考虑为什么子查询返回不止一个项,并且它返回正确的项。

< P>您可以尝试这种方式-< /P>
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

从tblMarkDownPlan中选择ItemType,而不是使用从tblMarkDownPlan中选择top 1 ItemType可能与@gitstar重复:然后您必须重写代码。不能在varchar值中存储多个值。如果你想循环多个项目类型,你可以使用一个表变量。先生,对不起,你能给我写一个简单的示例吗?@gitstar:你想用不同的值做什么?