L'exécution d'une procédure stockée distante dans sp_executesql

Je vais essayer d'obtenir IDENT_CURRENT de la valeur sur le serveur lié. J'ai créé une procédure stockée sp_current_identity sur le serveur distant qui a le paramètre de sortie.

CREATE  PROCEDURE [dbo].[sp_current_identity] ( @strTableName nvarchar(255), @intRowId int OUTPUT )
AS
BEGIN
select IDENT_CURRENT(@strTableName)
END

Après que j'ai créé deux synonymes:sp_current_identity et sometable.

J'ai besoin pour exécuter sp_current_identity sp_executesql (je suis de la création d'une coutume DataAtapter de travailler avec des synonymes via LLBLGEN 3.1). Veuillez voir l'exemple suivant:

declare @p4 int
set @p4=NULL
exec sp_executesql N'SET XACT_ABORT ON; INSERT INTO [db].[dbo].[sometable] ([FieldName], [TableName], [UserField]) VALUES (@p1, @p3, @p4) ;
exec dbo.sp_current_identity @p5, @p2 
;SET XACT_ABORT OFF',N'@p1 varchar(50),@p2 int output,@p3 varchar(50),@p4 varchar(50), @p5 varchar(200)',
@p1='test24',@p2=@p4 output,@p3='test24',@p4='test5',@p5='sometable'
select @p4

Il fonctionne très bien lorsque ce code est exécuté sur le serveur distant (où sp_current_identity est une procédure stockée locale), mais il provoque une exception lorsque le code est exécuté sur le serveur local.
Voici le message d'erreur:

Procédure ou la fonction 'sp_current_identity' attend le paramètre '@strTableName", qui n'a pas été fourni.

Merci pour votre aide!

  • Votre code est incorrect car le contrôle de la IDENT_CURRENT après l'insertion est incorrect. En vertu de l', même légère, de la simultanéité de votre script de démarrage de retour de la dernière identité inséré par l'autre session(s) et votre application ne peut pas fonctionner correctement ensuite. Utilisation INSERT INTO ... OUTPUT inserted.idcolumn à la place.
  • Merci pour la réponse rapide. Il semble que je ne peux pas utiliser "INSERT INTO ... SORTIE inséré.idcolumn" parce que "sometable" est un synonyme de la table distante.
  • Toujours pas sûr de savoir pourquoi vous ne pouvez pas créer la procédure stockée à l'autre extrémité, que d'effectuer l'insertion et de sortie SCOPE_IDENTITY()?
InformationsquelleAutor Alex | 2011-08-01