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. UtilisationINSERT 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()?
Vous devez vous connecter pour publier un commentaire.
Avez-vous pensé à l'exécution de
EXEC remoteserver.database.dbo.sp_executesql 'dynamic SQL';
au lieu d'essayer d'exécuter le SQL dynamique localement? Le sp_current_identity procédure doit exister à l'endroit où la requête est exécutée, pas en où la requête est appelée à partir d'.J'ai trouvé que j'avais monter mon appel dynamique pour le serveur distant en deux étapes. J'ai essayé d'obtenir l'ID de Base de données: