我用php和相关变量调用该过程。我需要最新的ID才能将它用于下一个插入,因此我使用SCOPE_IDENTITY设置变量。返回值始终是appointment_id的值?!
ALTER proc [dbo].[insertPersonWithCmoFmo]
@appointment_id int,
@kostenstelle varchar(50),
@vorname varchar(50),
@nachname varchar(50),
@ci_nummer int,
@anzahl_monitore_old int,
@raum varchar(50),
@gebäude varchar(50),
@bemerkung text,
@hardware_typ varchar(50),
@anzahl_monitore_new varchar(50),
@zubehör text
as
DECLARE
@latestPersonID int,
@latestCmoID int,
@latestFmoID int
BEGIN
INSERT INTO [RC.Persons] (kostenstelle, vorname, nachname) VALUES (@kostenstelle, @vorname, @nachname);
SET @latestPersonID = (SELECT SCOPE_IDENTITY())
INSERT INTO [RC.CMO] (ci_nummer, anzahl_monitore, raum, gebäude, bemerkung) values (@ci_nummer, @anzahl_monitore_old, @raum, @gebäude, @bemerkung);
SET @latestCmoID = (SELECT SCOPE_IDENTITY())
INSERT INTO [RC.FMO] (hardware_typ, anzahl_monitore, zubehör) values (@hardware_typ, @anzahl_monitore_new, @zubehör);
SET @latestFmoID = (SELECT SCOPE_IDENTITY())
INSERT INTO [RC.Appointments_RC.CMO] (cmo_id, appointment_id) values (@latestCmoID, @appointment_id);
INSERT INTO [RC.Persons_RC.CMO] (cmo_id, person_id) VALUES (@latestCmoID, @latestPersonID);
INSERT INTO [RC.Persons_RC.FMO] (fmo_id, person_id) VALUES (@latestFmoID, @latestPersonID);
return @latestFmoID
END
这是exec代码。为什么在所有varchar类型之前都是“N”?
USE [Testtable]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[insertPersonWithCmoFmo]
@appointment_id = 52,
@kostenstelle = N'54',
@vorname = N'testname',
@nachname = N'testlastname',
@ci_nummer = 111222333,
@anzahl_monitore_old = 2,
@raum = N'255',
@gebäude = N'KWA12',
@bemerkung = N'blablabla',
@hardware_typ = N'Desktop',
@anzahl_monitore_new = N'4',
@zubehör = N'Test'
SELECT 'Return Value' = @return_value
GO
SQL输出: Meldung 2601,Ebene 14,Status 1,Prozedur insertPersonWithCmoFmo,Zeile 36 无法在对象'dbo.RC.FMO'中插入具有唯一索引'NonClusteredIndex-20140116-143317'的重复键行。重复键值为()。 声明已经终止。
答案 0 :(得分:1)
有什么关于您不理解的错误消息吗?一个或多个表具有唯一约束(或索引),并且您尝试在表中插入相同的值。例如,persons
表可能已包含此人。
字符串前的N
显式地使字符串使用宽字符。
您的存储过程可能需要重写。您需要检查沿途可能发生的错误。传统上,使用OUTPUT
参数返回值。
获取新id
值的最安全方法是使用output
语句的insert
子句(请参阅文档here)。
答案 1 :(得分:0)
N表示nvarchar而不是varchar。
请参阅: https://stackoverflow.com/questions/10025032/what-is-the-meaning-of-the-prefix-n-in-t-sql-statements