Je le tableau suivant:Impossible d'insérer l'enregistrement de la procédure stockée appelée de service Web
CREATE TABLE [dbo].[omgbbq](
[tbl_key] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](10) NOT NULL,
[id] [int] NULL,
CONSTRAINT [PK_omgbbq] PRIMARY KEY CLUSTERED
(
[tbl_key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
... et la procédure stockée suivante:
CREATE PROCEDURE sp_omgwth
@name VARCHAR(10),
@id INT
AS
BEGIN
INSERT INTO omgbbq (name, id) VALUES (@name, @id);
SELECT MAX(tbl_key) AS Max_tbl_key FROM omgbbq;
END
J'ai ajouté un seul enregistrement en appelant la procédure de SSMS:
EXEC sp_omgwth 'Gareth', 2
et obtenir
tbl_key,name,id
1,Gareth,2
Jusqu'ici, tout va bien. Un collègue essaie de l'appeler à partir d'un service Web et obtient le retour 'Max_tbl_key' 2
Également comme prévu. Toutefois, l'enregistrement n'apparaît pas dans le tableau. Lorsque j'ajoute un nouveau record en appelant le SP de SSMS, nous voyons ce qui suit dans le tableau:
tbl_key,name,id
1,Gareth,2
3,Gawain,4
Il est comme il a ajouté l'enregistrement, qui incrémente la valeur d'identité, mais ... Je ne savoir, roulé en arrière ou quelque chose.
Des idées? Nous nous connectons tous les deux au serveur en tant que même utilisateur, donc il ne semble pas que cela puisse être un problème d'autorisations d'identification. Nous obtenons ce même comportement d'une autre table et d'un autre SP, ce qui explique pourquoi nous avons créé ces deux tests.
Vous ne devez JAMAIS ** utiliser 'SELECT MAX (tbl_key) ...' pour obtenir la valeur d'une colonne 'IDENTITY' - utilisez' SELECT SCOPE_IDENTITY() ... 'à la place! Beaucoup plus sûr - ne cassera pas dans les situations de concurrence! –
Je devrais probablement préciser que les développeurs ont retracé le problème autant qu'ils le pouvaient. Ils ont constaté que l'instruction SQL transmise fonctionnait parfaitement lorsqu'elle était copiée et collée dans SSMS. En outre, l'utilisation de la même base de code pour ajouter un enregistrement via une instruction INSERT a également fonctionné. Il semble y avoir quelque chose d'étrange à propos du webservice appelant une procédure stockée avec un INSERT. – mdoyle
D'accord avec le commentaire 'marc'' ci-dessus. Vous ne devriez pas utiliser 'MAX'. Veuillez poster votre code de service Web. Être dans une transaction qui ne s'engage jamais semble faisable. –