【问题标题】:Stored procedure with variables not working带有变量的存储过程不起作用
【发布时间】: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”中插入重复的键行。重复键值为 ()。 声明已终止。

【问题讨论】:

标签: php sql sql-server stored-procedures


【解决方案1】:

您对错误消息有什么不明白的地方吗?一个或多个表具有唯一约束(或索引),并且您正试图在表中插入相同的值。例如,persons 表中可能已经包含此人。

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

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

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

【讨论】:

  • ID 都是自动递增的。所以我不明白为什么表中可以有重复的 id。
  • @mnlfischer 。 . .重复项不在自动递增的 ID 上。例如,hardware_typ, anzahl_monitore, zubehör 上可能有一个唯一索引,并且您正在那里插入重复项。 (问题出在FMO 表上。)
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2014-09-04
相关资源
最近更新 更多