如何解决使用过程将值插入表
我尝试实现主要目的是将数据存储到单独的表中的过程。我首先要执行此操作,首先从带有标量变量的简单查询开始。在下面您可以看到代码:
DECLARE @CustomerId int=8
DECLARE @validFrom date='2019.01.01'
DECLARE @ValidTo date='2019.03.01'
DECLARE @EmployeeID int=8
SELECT CONCAT(c.FirstName,' ',c.LastName) AS CustomerFullName,lo.Name as LocationName,acd.Amount,cu.Name as Currency,acc.EmployeeId,@validFrom as ValidFrom,@ValidTo as ValidTo,CONCAT(emp.FirstName,emp.LastName) AS EmployeeFullName
FROM dbo.Customer as c
INNER JOIN dbo.Account AS acc ON acc.CurrencyId=c.Id
INNER JOIN dbo.AccountDetails AS acd ON acd.AccountId=acc.Id
INNER JOIN dbo.Currency AS cu ON cu.id=acc.CurrencyId
INNER JOIN dbo.Location as lo ON lo.Id=acd.LocationId
INNER JOIN dbo.Employee AS emp ON emp.ID=acc.EmployeeId
WHERE acc.CustomerId=@CustomerId and acd.TransactionDate between @validFrom and @ValidTo and acc.EmployeeId=@EmployeeID
所以上面的代码效果很好,并给了我期望的结果。
所以下一步是将此代码放入过程中,以便用过程中的数据填充表。因此,我制作了表,并尝试将上面的代码放入过程中
CREATE TABLE dbo.CustomerReportLogs (
ID int IDENTITY (1,1) NOT NULL,CustomerFullName NVARCHAR(100) NOT NULL,LocationName NVARCHAR(100) NOT NULL,Amount decimal (18,2) NOT NULL,Currency NVARCHAR (20)NOT NULL,EmployeeId int NOT NULL,ValidFrom date NOT NULL,ValidTo date NOT NULL,EmployeeFullName NVARCHAR(100) NOT NULL,CONSTRAINT PK_ID_CustomerReportLogs PRIMARY KEY CLUSTERED (
ID ASC
))
GO
CREATE OR ALTER PROCEDURE dbo.procedure1 (@CustomerId int,@validFrom date,@ValidTo date,@EmployeeID int)
AS
BEGIN
SELECT CONCAT(c.FirstName,emp.LastName) AS EmployeeFullName
FROM dbo.Customer as c
INNER JOIN dbo.Account AS acc ON acc.CurrencyId=c.Id
INNER JOIN dbo.AccountDetails AS acd ON acd.AccountId=acc.Id
INNER JOIN dbo.Currency AS cu ON cu.id=acc.CurrencyId
INNER JOIN dbo.Location as lo ON lo.Id=acd.LocationId
INNER JOIN dbo.Employee AS emp ON emp.ID=acc.EmployeeId
WHERE acc.CustomerId=@CustomerId and acd.TransactionDate between @validFrom and @ValidTo and acc.EmployeeId=@EmployeeID
SELECT *
INSERT INTO dbo.CustomerReportLogs(CustomerFullName,LocationName,Amount,Currency,EmployeeId,ValidFrom,ValidTo,EmployeeFullName)
VALUES (@CustomerFullName,@LocationName,@Amount,@Currency,@EmployeeId,@ValidFrom,@ValidTo,@EmployeeFullName)
Return
END
GO
上述过程中的错误消息是我需要声明标量变量@CustomerFullName,但实际上该变量是我从具有concat函数的代码中获得的,而不是标量。因此,可能在我的代码的最后一部分中我有一些错误。那么有人可以帮我解决这个错误吗?
Msg 137,Level 15,State 2,Procedure procedure1,Line 29 [Batch Start Line 3767]
Must declare the scalar variable "@CustomerFullName".
解决方法
您实际上并没有将返回的值存储在变量中。你可以做到这一点您首先声明变量,然后使用类似<pending>
的方法,但要容易得多的是将SELECT直接替换为INSERT。即
SELECT @CustomerFullName = CONCAT(c.FirstName,' ',c.LastName) .... FROM ...
请注意,这尚未经过测试,但我只是复制/粘贴了您自己的代码
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。