使用不带 null 的存储过程更新 table
Update table with stored procedure without null
我尝试实施主要目标是将数据存储到新的单独 table.First 我创建 table 我想用数据填充的程序
CREATE TABLE dbo.CustomerReportLogs (
ID int IDENTITY (1,1) NOT NULL,
CustomerFullName NVARCHAR(100) NULL,
LocationName NVARCHAR(100) NULL,
Amount decimal (18,2) NULL,
Currency NVARCHAR (20) NULL,
EmployeeId int NULL,
ValidFrom date NULL,
ValidTo date NULL,
CONSTRAINT PK_ID_CustomerReportLogs PRIMARY KEY CLUSTERED (
ID ASC
))
GO
因此下一步是如何使用存储过程填充此 table。我为了做到这一点我写了这行代码:
CREATE OR ALTER PROCEDURE dbo.procedure2 (@CustomerId int, @validFrom date, @ValidTo date,@EmployeeID int)
AS
BEGIN
SELECT CONCAT(c.FirstName, ' ', c.LastName) AS CustomerFullName, lo.Name as LocationName,acd.Amount as Amount,cu.Name as Currency,acc.EmployeeId,@validFrom as ValidFrom,@ValidTo as ValidTo
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
DECLARE @CustomerFullName NVARCHAR(100)
DECLARE @LocationName NVARCHAR(100)
DECLARE @Amount decimal (18,2)
DECLARE @Currency NVARCHAR (20)
INSERT INTO dbo.CustomerReportLogs(CustomerFullName,LocationName,Amount,Currency,EmployeeId,ValidFrom,ValidTo)
VALUES (@CustomerFullName,@LocationName,@Amount,@Currency,@EmployeeId,@ValidFrom,@ValidTo)
SELECT @CustomerFullName as CustomerFullName,@LocationName AS LocationName,@Amount AS Amount,@Currency as Currency,
@EmployeeId as EmployeeId,@ValidFrom as ValidFrom ,@ValidTo as ValidTo
END
GO
上面的代码创建了存储过程,但现在出现了新问题,即当我尝试首先执行此命令时
EXEC dbo.procedure2 @CustomerId=8,@validFrom='2019.01.25', @ValidTo='2019.03.01', @EmployeeID=8
所以这个过程无法正确更新 dbo.CustomerReportLogs 所以我得到了一些 null 结果和一些 values.Output 你可以在下面的图片中看到:
[![在此处输入图片描述][1]][1]
那么谁能帮我如何正确更新此 table 而不是使用 null
CREATE OR ALTER PROCEDURE dbo.procedure2 (
@CustomerId INT
,@validFrom DATE
,@ValidTo DATE
,@EmployeeID INT
)
AS
BEGIN
INSERT INTO dbo.CustomerReportLogs (
CustomerFullName
,LocationName
,Amount
,Currency
,EmployeeId
,ValidFrom
,ValidTo
)
OUTPUT INSERTED.[CustomerFullName],INSERTED.[LocationName],INSERTED.[Amount],INSERTED.[Currency],INSERTED.[EmployeeId],INSERTED.[ValidFrom] ,INSERTED.[ValidTo]
SELECT CONCAT (c.FirstName,' ',c.LastName) AS CustomerFullName
,lo.Name AS LocationName
,acd.Amount AS Amount
,cu.Name AS Currency
,acc.EmployeeId
,@validFrom AS ValidFrom
,@ValidTo AS ValidTo
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
END
我尝试实施主要目标是将数据存储到新的单独 table.First 我创建 table 我想用数据填充的程序
CREATE TABLE dbo.CustomerReportLogs (
ID int IDENTITY (1,1) NOT NULL,
CustomerFullName NVARCHAR(100) NULL,
LocationName NVARCHAR(100) NULL,
Amount decimal (18,2) NULL,
Currency NVARCHAR (20) NULL,
EmployeeId int NULL,
ValidFrom date NULL,
ValidTo date NULL,
CONSTRAINT PK_ID_CustomerReportLogs PRIMARY KEY CLUSTERED (
ID ASC
))
GO
因此下一步是如何使用存储过程填充此 table。我为了做到这一点我写了这行代码:
CREATE OR ALTER PROCEDURE dbo.procedure2 (@CustomerId int, @validFrom date, @ValidTo date,@EmployeeID int)
AS
BEGIN
SELECT CONCAT(c.FirstName, ' ', c.LastName) AS CustomerFullName, lo.Name as LocationName,acd.Amount as Amount,cu.Name as Currency,acc.EmployeeId,@validFrom as ValidFrom,@ValidTo as ValidTo
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
DECLARE @CustomerFullName NVARCHAR(100)
DECLARE @LocationName NVARCHAR(100)
DECLARE @Amount decimal (18,2)
DECLARE @Currency NVARCHAR (20)
INSERT INTO dbo.CustomerReportLogs(CustomerFullName,LocationName,Amount,Currency,EmployeeId,ValidFrom,ValidTo)
VALUES (@CustomerFullName,@LocationName,@Amount,@Currency,@EmployeeId,@ValidFrom,@ValidTo)
SELECT @CustomerFullName as CustomerFullName,@LocationName AS LocationName,@Amount AS Amount,@Currency as Currency,
@EmployeeId as EmployeeId,@ValidFrom as ValidFrom ,@ValidTo as ValidTo
END
GO
上面的代码创建了存储过程,但现在出现了新问题,即当我尝试首先执行此命令时
EXEC dbo.procedure2 @CustomerId=8,@validFrom='2019.01.25', @ValidTo='2019.03.01', @EmployeeID=8
所以这个过程无法正确更新 dbo.CustomerReportLogs 所以我得到了一些 null 结果和一些 values.Output 你可以在下面的图片中看到: [![在此处输入图片描述][1]][1]
那么谁能帮我如何正确更新此 table 而不是使用 null
CREATE OR ALTER PROCEDURE dbo.procedure2 (
@CustomerId INT
,@validFrom DATE
,@ValidTo DATE
,@EmployeeID INT
)
AS
BEGIN
INSERT INTO dbo.CustomerReportLogs (
CustomerFullName
,LocationName
,Amount
,Currency
,EmployeeId
,ValidFrom
,ValidTo
)
OUTPUT INSERTED.[CustomerFullName],INSERTED.[LocationName],INSERTED.[Amount],INSERTED.[Currency],INSERTED.[EmployeeId],INSERTED.[ValidFrom] ,INSERTED.[ValidTo]
SELECT CONCAT (c.FirstName,' ',c.LastName) AS CustomerFullName
,lo.Name AS LocationName
,acd.Amount AS Amount
,cu.Name AS Currency
,acc.EmployeeId
,@validFrom AS ValidFrom
,@ValidTo AS ValidTo
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
END