Sql “子查询返回的值超过1”-在尝试创建存储过程时收到
我在创建存储过程时遇到了一些问题,该过程将记录添加到临时表中 我得到的是上面的错误消息,不是在我尝试执行过程时,而是在第一次尝试创建过程时。我检查了语句中的每个子查询,它看起来正常,因为它们被设置为top 1,并且只返回一个值。我还注释掉了子选项,并用硬编码的值替换它们,但这仍然会产生相同的错误 当没有子查询时,它如何返回此错误 我已经在这里查看了其他答案,但它们似乎与子查询返回的多个值直接相关,而在本例中,这些值并没有发生Sql “子查询返回的值超过1”-在尝试创建存储过程时收到,sql,tsql,select,subquery,Sql,Tsql,Select,Subquery,我在创建存储过程时遇到了一些问题,该过程将记录添加到临时表中 我得到的是上面的错误消息,不是在我尝试执行过程时,而是在第一次尝试创建过程时。我检查了语句中的每个子查询,它看起来正常,因为它们被设置为top 1,并且只返回一个值。我还注释掉了子选项,并用硬编码的值替换它们,但这仍然会产生相同的错误 当没有子查询时,它如何返回此错误 我已经在这里查看了其他答案,但它们似乎与子查询返回的多个值直接相关,而在本例中,这些值并没有发生 -- Drop stored procedure if it alre
-- Drop stored procedure if it already exists
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA = N'dbo'
AND SPECIFIC_NAME = N'PLO_CreateExchanges'
)
DROP PROCEDURE dbo.PLO_CreateExchanges
GO
CREATE PROCEDURE dbo.PLO_CreateExchanges
@FirstExchange DATETIME,
@EndDate DATETIME,
@StartDate DATETIME,
@Frequency INT,
@AgreementID INT
AS
BEGIN
DECLARE @ExchangeDate DATETIME
DECLARE @NumberOfExchanges INT
DECLARE @ExchangeQty INT
--Data
WHILE @ExchangeDate <= @EndDate
BEGIN
IF @ExchangeDate >= @StartDate
BEGIN
--Do something
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL
BEGIN
DROP TABLE #Orders
END
ELSE
BEGIN
--Create Table
SELECT *
INTO #Orders
FROM dbo.Orders
WHERE id < 0
ALTER TABLE dbo.#Orders
DROP COLUMN id
END
SET @AgreementID = 1
INSERT INTO #Orders
(AgreementID ,
TransType ,
StartDate ,
EndDate ,
JobNumber ,
AddressID ,
DeliveryAddressID ,
AreaID ,
ProductTypeID ,
InternalNoteID ,
CollectionTime ,
ContainerTypeID ,
DeliveryContainerID ,
CollectionContainerID ,
NetCharge ,
SpecialPrice ,
VehicleID ,
DisposalSiteID ,
DisposalCharge ,
DisposalTicket ,
OnRoad ,
Authorisation1 ,
Authorisation2 ,
Weighed ,
Printed ,
InvoiceNumber ,
InvoiceDate ,
WeighbridgeTransactionID ,
RouteID ,
RouteSequence ,
Quantity ,
Activity ,
ContactPerson ,
ContactTime ,
Notes1 ,
Notes2 ,
Notes3 ,
InvoiceMethodID ,
ScheduledDate ,
Extracted ,
AdditionalCharge ,
AdditionalChargeDesc ,
ScheduledSiteID ,
ChargedBy ,
Weight ,
HaulierID ,
AllocationCode ,
ConsignmentNumber ,
PreNoteNumber ,
Drums ,
HaulageCharge ,
Rate ,
Manual ,
Hours ,
CurrencyID ,
Confirmed ,
Paid ,
VehicleTypeID ,
QuotationID ,
ContractID ,
ScheduledTypeID ,
TempField1 ,
TempField2 ,
PaymentID ,
EWCID ,
DisposalCost ,
Hold ,
SalesID ,
Cost ,
CostSpecial ,
HaulageCost ,
MobileStatus ,
Scheduled ,
Complete ,
SiteMobileStatus ,
ContainerPriceID ,
WeighbridgePriceID ,
OriginalQuantity ,
MissedEmail ,
DateTimeLastUpdated ,
LastUpdatedBy ,
IsDeleted)
SELECT @AgreementID , -- AgreementID - int
'D' , -- TransType - char(2)
A.StartDate , -- StartDate - datetime
A.StartDate , -- EndDate - datetime
NULL , -- JobNumber - int
A.AddressID , -- AddressID - int
A.DeliveryAddressID , -- DeliveryAddressID - int
A.AreaCodeID , -- AreaID - int
A.ProductTypeID , -- ProductTypeID - int
A.InternalNoteID , -- InternalNoteID - int
A.DropTime , -- CollectionTime - datetime
A.ContainerTypeID , -- ContainerTypeID - int
NULL , -- DeliveryContainerID - int
NULL , -- CollectionContainerID - int
A.DeliveryCharge , -- NetCharge - decimal
A.SpecialPrice , -- SpecialPrice - bit
A.DefaultDeliveryVehicleID , -- VehicleID - int
A.DisposalSiteID , -- DisposalSiteID - int
NULL , -- DisposalCharge - decimal
NULL , -- DisposalTicket - nvarchar(30)
A.OnRoad , -- OnRoad - bit
A.Authorisation1 , -- Authorisation1 - nvarchar(50)
A.Authorisation2 , -- Authorisation2 - nvarchar(50)
0 , -- Weighed - bit
0 , -- Printed - bit
0 , -- InvoiceNumber - int
NULL , -- InvoiceDate - datetime
NULL , -- WeighbridgeTransactionID - int
A.DeliveryRoute , -- RouteID - int
NULL , -- RouteSequence - int
1 , -- Quantity - int
NULL , -- Activity - nvarchar(10)
A.ContactPerson , -- ContactPerson - nvarchar(250)
A.ContactTime , -- ContactTime - datetime
A.Notes1 , -- Notes1 - nvarchar(350)
A.Notes2 , -- Notes2 - nvarchar(350)
A.Notes3 , -- Notes3 - nvarchar(350)
A.InvoiceMethodID , -- InvoiceMethodID - int
A.StartDate , -- ScheduledDate - datetime
0 , -- Extracted - bit
(SELECT CASE WHEN A.ApplyToDelivery = 1 THEN A.AdditionalCharge
ELSE 0
END) , -- AdditionalCharge - decimal
(SELECT CASE WHEN A.ApplyToDelivery = 1 THEN A.AdditionalFor
ELSE NULL
END) , -- AdditionalChargeDesc - nvarchar(350)
A.SiteID , -- ScheduledSiteID - int
'V' , -- ChargedBy - char(1)
NULL , -- Weight - decimal
A.HaulierID , -- HaulierID - int
NULL , -- AllocationCode - nvarchar(50)
NULL , -- ConsignmentNumber - nvarchar(50)
NULL , -- PreNoteNumber - nvarchar(50)
NULL , -- Drums - int
NULL , -- HaulageCharge - decimal
NULL , -- Rate - decimal
0 , -- Manual - bit
NULL , -- Hours - decimal
NULL , -- CurrencyID - int
0 , -- Confirmed - bit
0 , -- Paid - bit
(SELECT TOP 1
VehicleTypeID
FROM dbo.Vehicles V
WHERE id = A.DefaultDeliveryVehicleID AND V.IsDeleted = 0) , -- VehicleTypeID - int
0 , -- QuotationID - int
0 , -- ContractID - int
(SELECT TOP 1
ScheduleTypeID
FROM dbo.ContainerTypes CT
WHERE id = A.ContainerTypeID AND CT.IsDeleted = 0) , -- ScheduledTypeID - int
A.TempField1 , -- TempField1 - nvarchar(250)
A.TempField2 , -- TempField2 - nvarchar(250)
NULL , -- PaymentID - int
(SELECT TOP 1
EWCID
FROM dbo.ProductCodes PC
WHERE id = A.ProductTypeID AND PC.IsDeleted = 0) , -- EWCID - int
NULL , -- DisposalCost - decimal
0 , -- Hold - bit
A.SalesPersonID , -- SalesID - int
NULL , -- Cost - decimal
0 , -- CostSpecial - bit
NULL , -- HaulageCost - decimal
0 , -- MobileStatus - int
1 , -- Scheduled - bit
0 , -- Complete - bit
NULL , -- SiteMobileStatus - int
0 , -- ContainerPriceID - int
0 , -- WeighbridgePriceID - int
A.Quantity , -- OriginalQuantity - int
NULL , -- MissedEmail - nvarchar(50)
GETDATE() , -- DateTimeLastUpdated - datetime
A.LastUpdatedBy , -- LastUpdatedBy - int
0 -- IsDeleted - bit
FROM dbo.Agreements A
WHERE id = @AgreementID AND A.IsDeleted = 0
END
SET @ExchangeDate = DATEADD(d,7*@Frequency,@ExchangeDate)
END
END
我有两个建议,希望能有所帮助 1检查查询返回的行数
Select * FROM
dbo.Agreements A
WHERE id = 1 AND A.IsDeleted = 0
如果只有一排,那就好了。
如果返回的行数超过1行或没有任何行,则在select查询中会出现问题,因为列的值不一致。假设每列有1个值,一列不能有一个值,另一列只能有2个值
2如果有多行,则可能需要在SELECT查询的开头添加TOP 1,以便插入Orders temp表。但是,如果将重复或脏数据带到协议表中,您可能仍然需要清理不需要的行。我复制了您的代码,添加了USE MyDatabase语句,并且成功创建了存储过程。它没有抱怨您没有协议表?正如旁注所示,除了agreementID之外,我把select中的所有代码都注释掉了。它仍然给出了错误,直到我删除了注释代码。当我在评论的部分添加内容时,我又犯了错误。我让另一位开发人员尝试了同样的结果。@connersz-通常,视图和存储过程在实际运行之前都不会以这种方式进行验证,因为在某些用例中,表在实际运行前不久才存在。比如说,一个sp在其中创建一个包含一些数据的临时表,然后从中进行选择。。。您不需要在SELECT案例中使用SELECT。。。。没有ORDERBY的TOP 1是没有意义的——要么您有多行,需要先对它们进行排序,要么您只有一行,可以进行常规联接。语句在负前导空格中按原样工作。@Clockwork Muse不考虑意见。不管怎样,没有循环它就不能工作。
Select * FROM
dbo.Agreements A
WHERE id = 1 AND A.IsDeleted = 0