Violation de la contrainte UNIQUE KEY lors de la mise à jour SQL

J'ai une table de database simple (SQL Server 2008 R2 Express), qui a une définition comme suit:

ID INT Auto Inc, PK Name VARCHAR(64) Unique Key Telephone VARCHAR(128) 

J'ai une procédure stockée que j'exécute pour mettre à jour les loggings dans la table qui fait essentiellement ce qui suit:

 UPDATE customers SET Name = @name, Telephone = @Telephone WHERE id = @id 

Actuellement, j'ai deux inputs dans le tableau

 ID Name Telephone 1 Fred 01234 567890 2 John 09876 543210 

Lorsque j'appelle ma procédure stockée pour mettre à jour le numéro de téléphone pour John, le SQL qui est effectivement exécuté est

 UPDATE customers SET Name = 'John', Telephone = '02468 135790' WHERE id = 2 

Cela génère une violation UNIQUE KEY sur le champ Name . Maintenant que le champ Nom ne change pas, pourquoi cela se produit-il?

Comme toutes les actions de la database sont traitées par mon application à l'aide de procédures stockées, je peux résoudre ce problème en supprimant la contrainte et en modifiant les procédures stockées pour appliquer manuellement la contrainte, mais cela semble incorrect.

Étant donné que ma table a effectivement beaucoup plus de champs, il doit y avoir un travail générique que je peux utiliser pour éviter ces faux problèmes de contraintes, sans avoir à générer de nombreuses procédures stockées pour mettre à jour des champs spécifiques.

Edit : Le tableau ci-dessus a été simplifié pour garder la question plus gérable, je suis sûr que je n'ai pas manqué quelque chose d'important, mais pour info, la définition réelle de la table est la suivante

 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[companies]( [id] [int] IDENTITY(1,1) NOT NULL, [typeId] [int] NOT NULL, [name] [varchar](64) NOT NULL, [displayName] [varchar](128) NOT NULL, [deliveryAddress] [varchar](1024) NOT NULL, [invoiceAddress] [varchar](1024) NOT NULL, [telephone] [varchar](64) NOT NULL, [fax] [varchar](64) NOT NULL, [email] [varchar](256) NOT NULL, [website] [varchar](256) NULL, [isActive] [bit] NOT NULL, CONSTRAINT [PK_companies] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [Unique Display Name] UNIQUE NONCLUSTERED ( [displayName] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [Unique Name] UNIQUE NONCLUSTERED ( [name] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[companies] WITH CHECK ADD CONSTRAINT [Company Type] FOREIGN KEY([id]) REFERENCES [dbo].[companyTypes] ([id]) GO ALTER TABLE [dbo].[companies] CHECK CONSTRAINT [Company Type] GO 

… et la procédure stockée

 ALTER PROCEDURE UpdateCompany @id INT, @typeId INT, @name VARCHAR(64), @displayName VARCHAR(128), @deliveryAddress VARCHAR(1024), @invoiceAddress VARCHAR(1024), @telephone VARCHAR(64), @fax VARCHAR(64), @email VARCHAR(256), @website VARCHAR(256), @isActive BIT AS BEGIN UPDATE companies SET typeid = @typeid, name = @name, displayname = @displayname, deliveryAddress = @deliveryAddress, invoiceAddress = @invoiceAddress, telephone = @telephone, fax = @fax, email = @email, website = @website, isActive = @isActive EXEC GetCompany @id END GO 

Il vous manque le WHERE dans votre instruction UPDATE donc actuellement, il va essayer de mettre à jour toutes les lignes de la table avec les mêmes valeurs.