在存储过程内使用多个选择语句

时间:2019-01-27 01:19:25

标签: sql-server

我正在建立一个数据库来保存交易记录。交易票据是通过存储过程存储的。

交易项目表具有以下外键:

Driver Id  
Producer Id   
Carrier Id   

我想通过引用相应的外键(即)使用“ SELECT”和“ INSERT INTO”来存储以下内容。 dbo.Driver DriverId

"dbo.Driver DriverFisrtName"    
"dbo.Driver DriverLastName"    
"dbo.Producer ProducerName"    
"dbo.Carrier CarrierName"    

我遇到的问题是了解在存储过程内部执行此操作的最佳方法。

ALTER PROCEDURE [dbo].[TransactionTicket] 
    @EstBarrels INT,
    @DrvierId INT,
    @CarrierId INT,
    @ProducerId INT,
    @LaneId INT,
    @StartTime VARCHAR(50),
    @StartDate VARCHAR(50),
    @EndTime VARCHAR(50),
    @EndDate VARCHAR(50),
    @MeterGsvStart REAL,
    @MeterGsvStop REAL,
    @MeterNsvStart REAL,
    @MeterNsvStop REAL,
    @TransactionNetTotal REAL,
    @TransactionGsvTotal REAL,
    @AvgTemp REAL,
    @UserTicket INT,
    @Density REAL,
    @MeterFactor REAL,
    @AvgBsw REAL,
    @Id INT OUTPUT,
    @FirstName VARCHAR(50),
    @LastName VARCHAR(50),
    @ProducerName VARCHAR(50),
    @CarrierName VARCHAR(50)      
AS
BEGIN
    SET NOCOUNT ON;

    --Declare @DriverId INT
    INSERT INTO @FirstName
        SELECT FirstName 
        FROM dbo.driver  
        WHERE DriverId = @DrvierId ;

    INSERT INTO @LastName
        SELECT LastName 
        FROM dbo.driver  
        WHERE DriverId = @DrvierId ;

    INSERT INTO @ProducerName
        SELECT ProducerName 
        FROM dbo.Producer  
        WHERE ProducerId = @ProducerId ;

    INSERT INTO @CarrierName
        SELECT CarrierName 
        FROM dbo.Carrier  
        WHERE CarrierId = @CarrierId ;

    -- Insert statements for procedure here
    INSERT INTO TransactionItem (DriverId, CarrierId, ProducerId, LaneId, 
AverageTemp, MeterStartGSV,
            MeterStopGSV, MeterStartNSV, MeterStopNSV, 
TotalBarrelsGSV, TotalBarrelsNSV, EstimatedBarrels,
            Density, MeterFactor, StartTime, StartDate, 
EndTime, EndDate, AvgBsw, FirstName, LastName, ProducerName, CarrierName)
    VALUES (@DrvierId, @CarrierId, @ProducerId, @LaneId, @AvgTemp, 
(@MeterGsvStart/100), (@MeterGsvStop/100), (@MeterNsvStart/100),
        (@MeterNsvStop/100), (@TransactionGsvTotal/100), 
(@TransactionNetTotal/100), @EstBarrels, @Density, @MeterFactor,
        @StartTime, @StartDate, @EndTime, @EndDate, @AvgBsw, 
@FirstName, @LastName, @ProducerName, @CarrierName);

    SET @Id = SCOPE_IDENTITY()
    RETURN @Id
END

这是我得到的错误:

  

第10行,状态1,状态1,过程TransactionTicket,第54行,消息10
  必须声明表变量“ @FirstName”。

     

第10行,状态16,状态1,过程TransactionTicket,第56行的消息10
  必须声明表变量“ @LastName”。

     

第10行,状态1,状态1,过程TransactionTicket,第58行,消息10
  必须声明表变量“ @ProducerName”。

     

第60行,状态16,状态1,过程TransactionTicket消息1087
  必须声明表变量“ @CarrierName”。

2 个答案:

答案 0 :(得分:1)

INSERT INTO语句仅对有效-不适用于单个变量。

所以代替这个:

INSERT INTO @FirstName
    SELECT FirstName 
    FROM dbo.driver  
    WHERE DriverId = @DrvierId ;

您真的需要这个:

SELECT @FirstName = FirstName 
FROM dbo.driver  
WHERE DriverId = @DrvierId ;

而且,您可以同时从SELECT设置多个变量-像这样:

SELECT 
    @FirstName = FirstName,
    @LastName = LastName
FROM dbo.driver  
WHERE DriverId = @DrvierId ;

答案 1 :(得分:-1)

您可以使用cursors从表中将多个字段数据提取到变量中。

ALTER PROCEDURE [dbo].[TransactionTicket] 
@EstBarrels INT,
@DrvierId INT,
@CarrierId INT,
@ProducerId INT,
@LaneId INT,
@StartTime VARCHAR(50),
@StartDate VARCHAR(50),
@EndTime VARCHAR(50),
@EndDate VARCHAR(50),
@MeterGsvStart REAL,
@MeterGsvStop REAL,
@MeterNsvStart REAL,
@MeterNsvStop REAL,
@TransactionNetTotal REAL,
@TransactionGsvTotal REAL,
@AvgTemp REAL,
@UserTicket INT,
@Density REAL,
@MeterFactor REAL,
@AvgBsw REAL,
@Id INT OUTPUT,
@FirstName VARCHAR(50),
@LastName VARCHAR(50),
@ProducerName VARCHAR(50),
@CarrierName VARCHAR(50)      
AS
BEGIN
    SET NOCOUNT ON;

    Declare nextctr cursor for
    SELECT FirstName ,LastName
    FROM dbo.driver  
    WHERE DriverId = @DrvierId
    Open nextctr
    Fetch next from nextctr into @FirstName, @LastName
    Close nextctr
    Deallocate nextctr

    --or you can use set operator for retrieving single value
    Set @ProducerName =(
    SELECT ProducerName 
    FROM dbo.Producer  
    WHERE ProducerId = @ProducerId)

    Set @CarrierName = 
    (SELECT CarrierName 
    FROM dbo.Carrier  
    WHERE CarrierId = @CarrierId)

    -- Insert statements for procedure here
    INSERT INTO TransactionItem (DriverId, CarrierId, 
    ProducerId, LaneId, 
    AverageTemp, MeterStartGSV,
    MeterStopGSV, MeterStartNSV, MeterStopNSV, 
    TotalBarrelsGSV, TotalBarrelsNSV, EstimatedBarrels,
    Density, MeterFactor, StartTime, StartDate, 
    EndTime, EndDate, AvgBsw, FirstName, LastName, 
    ProducerName, CarrierName)
    VALUES (@DrvierId, @CarrierId, @ProducerId, @LaneId, 
   @AvgTemp, 
   (@MeterGsvStart/100), (@MeterGsvStop/100), 
   (@MeterNsvStart/100),
   (@MeterNsvStop/100), (@TransactionGsvTotal/100), 
   (@TransactionNetTotal/100), @EstBarrels, @Density, 
   @MeterFactor,
   @StartTime, @StartDate, @EndTime, @EndDate, 
   @AvgBsw, 
   @FirstName, @LastName, @ProducerName, 
   @CarrierName);

    SET @Id = SCOPE_IDENTITY()
    RETURN @Id
END
相关问题