Sql “子查询返回的值超过1”-在尝试创建存储过程时收到

Sql “子查询返回的值超过1”-在尝试创建存储过程时收到,sql,tsql,select,subquery,Sql,Tsql,Select,Subquery,我在创建存储过程时遇到了一些问题,该过程将记录添加到临时表中 我得到的是上面的错误消息,不是在我尝试执行过程时,而是在第一次尝试创建过程时。我检查了语句中的每个子查询,它看起来正常,因为它们被设置为top 1,并且只返回一个值。我还注释掉了子选项,并用硬编码的值替换它们,但这仍然会产生相同的错误 当没有子查询时,它如何返回此错误 我已经在这里查看了其他答案,但它们似乎与子查询返回的多个值直接相关,而在本例中,这些值并没有发生 -- Drop stored procedure if it alre

我在创建存储过程时遇到了一些问题,该过程将记录添加到临时表中

我得到的是上面的错误消息,不是在我尝试执行过程时,而是在第一次尝试创建过程时。我检查了语句中的每个子查询,它看起来正常,因为它们被设置为top 1,并且只返回一个值。我还注释掉了子选项,并用硬编码的值替换它们,但这仍然会产生相同的错误

当没有子查询时,它如何返回此错误

我已经在这里查看了其他答案,但它们似乎与子查询返回的多个值直接相关,而在本例中,这些值并没有发生

-- 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