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:你想用不同的值做什么?