我正在建立一个数据库来保存交易记录。交易票据是通过存储过程存储的。
交易项目表具有以下外键:
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”。
答案 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