Sql server 为什么在使用存储过程通过视图上的触发器创建行时会出现预期的参数错误?
数据库中有三个表:Sql server 为什么在使用存储过程通过视图上的触发器创建行时会出现预期的参数错误?,sql-server,stored-procedures,triggers,Sql Server,Stored Procedures,Triggers,数据库中有三个表: “商业实体”。2.“坚定”和“坚定”。“客户”。他们的关系如图所示。 无论何时创建新的客户行: 应自动创建新的BusinessEntity行 它应该将其BusinessEntityID值传递给(自动)新创建的公司行 最后,新创建的公司应该将其自己的BusinessEntityID作为FirmID列提交给Customer表 (在一对一的关系中,如果不首先创建BusinessEntity行,则无法创建公司,并且新客户应为新公司或个人) 我创建了这个存储过程,通过插入一对新的Bu
CREATE PROCEDURE [dbo].[CreateFirmCustomer](@FirmName NVARCHAR(30), @CustomerName NVARCHAR(28)) AS
BEGIN;
SET NOCOUNT ON;
BEGIN TRANSACTION;
INSERT BusinessEntity DEFAULT VALUES;
DECLARE @BusinessEntityID INT = SCOPE_IDENTITY();
SET IDENTITY_INSERT [dbo].[Firm] ON
INSERT Firm(BusinessEntityID, FirmName)
VALUES (@BusinessEntityID, @FirmName);
SET IDENTITY_INSERT [dbo].[Firm] OFF
INSERT Customer(FirmID, CustomerName)
VALUES (@BusinessEntityID, @CustomerName);
DECLARE @CustomerID INT = SCOPE_IDENTITY();
SELECT @BusinessEntityID AS FirmID, @CustomerID AS CustomerID;
COMMIT;
END;
GO
然后我创建了这个视图,通过使用INSTEAD of insert触发器将客户作为公司插入:
CREATE VIEW [dbo].[vBusEntityFirmCustomer]
AS
SELECT dbo.Firm.FirmName, dbo.Customer.CustomerName
FROM dbo.BusinessEntity INNER JOIN
dbo.Firm ON dbo.BusinessEntity.BusinessEntityID = dbo.Firm.BusinessEntityID INNER JOIN
dbo.Customer ON dbo.Firm.BusinessEntityID = dbo.Customer.FirmID
GO
在视图上触发:
CREATE TRIGGER [dbo].[trg_FirmCustomer]
ON [dbo].[vBusEntityFirmCustomer]
INSTEAD OF INSERT
AS
exec [dbo].[CreateFirmCustomer]
GO
但每次我输入新的FirmName CustomerName以插入新行时,我都会收到以下消息(见图):
过程或函数“CreateFirmCustomer”需要未提供的参数“@FirmName”。
事实上,我确实通过视图提供FirmName(以及CustomerName)
怎么了?错误消息非常清楚……您在调用CreateFirmCustomer时没有提供@FirmName。我想问你为什么需要两张桌子?他们的关系是1:1。只要将它合并到一个表中,就可以使用它了。@sean,正如我提到的,我确实通过视图提供了FirmName和CustomerName。那么要改变什么呢?现在需要两个表1:1模式用于其他目的…不,您正在调用“Exec dbo.CreateFirmCustomer”,它被定义为接受一个参数。。。而且,如果有人一次插入多行,这将失败,因为您没有传递插入的集合或任何东西。。。这里的整个方法有很多错误。再看看。看到你的扳机了吗?“exec[dbo].[CreateFirmCustomer]”您没有将FirmName或CustomerName传递给该过程。这是当前的问题,但这里还有其他问题,就像pmbAustin提到的一样。