变量不工作的存储过程

时间:2014-01-19 16:15:10

标签: php sql sql-server stored-procedures

我用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'的重复键行。重复键值为()。 声明已经终止。

2 个答案:

答案 0 :(得分:1)

有什么关于您不理解的错误消息吗?一个或多个表具有唯一约束(或索引),并且您尝试在表中插入相同的值。例如,persons表可能已包含此人。

字符串前的N显式地使字符串使用宽字符。

您的存储过程可能需要重写。您需要检查沿途可能发生的错误。传统上,使用OUTPUT参数返回值。

获取新id值的最安全方法是使用output语句的insert子句(请参阅文档here)。

答案 1 :(得分:0)