【发布时间】:2014-01-19 16:15:10
【问题描述】:
我用 php 和相关变量调用该过程。我需要最新的 ID 才能将其用于下一次插入,因此我使用 SCOPE_IDENTITY 设置变量。返回的总是约会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
这是执行代码。为什么所有 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,状态 1,Prozedur insertPersonWithCmoFmo,Zeile 36 无法在具有唯一索引“NonClusteredIndex-20140116-143317”的对象“dbo.RC.FMO”中插入重复的键行。重复键值为 ()。 声明已终止。
【问题讨论】:
-
Please use an output parameter or a resultset instead of
RETURNfor pulling data back from your procedure.RETURNis for error/status codes。此外,不要将single quotes用作别名分隔符 - 在某些情况下不推荐使用此语法,并使您的列看起来像字符串文字。如果您必须使用需要分隔的别名(提示:您应该避免使用它),请使用[square brackets]。
标签: php sql sql-server stored-procedures