Lorsque j'exécute cette requête (c'est une fonction scalaire), j'obtiens le résultat souhaité. Il renvoie un numéro d'expédition.Comment échanger un paramètre pour une valeur VARCHAR spécifique utilisée pour un serveur lié avec openquery
select ShipmentNo from openquery([SERVER_IP], 'SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo = ''G015246''')
Cependant, quand je swap sur G015246
avec le paramètre @PO
:
select @ShipmentLabels = ShipmentNo from openquery([SERVER_IP], 'SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo = ''@PO''')
Pour une raison quelconque la valeur de retour devient nulle avec ce changement.
Ma déclaration de retour pour les deux est:
RETURN ISNULL(@ShipmentLabels, @PO)
où @ShipmentLabels
est la valeur de retour souhaitée. Comme il est nul, il renvoie @PO
à la place, ce qui finit par être G015246
ce qui semble juste.
Quelqu'un remarque-t-il quelque chose de mal dans la façon dont j'ai ajouté le paramètre @PO
à l'instruction sql?
procédure stockée qui appelle la fonction (fnGetTheShippingLabels): Je suppose que la meilleure façon de décrire ce SP est le point de départ. Comme vous pouvez le voir ci-dessus, la fonction se trouve dans l'instruction SELECT du fournisseur de services (SP).
Scalar complète Fonction:
ALTER FUNCTION [dbo].[fnGetTheShippingLabels]
(
@PoHdrRecId INT,
@PoNo VARCHAR(20)
)
RETURNS VARCHAR(220)
AS
BEGIN
DECLARE @PO VARCHAR(20)= @PoNo
DECLARE @ShipmentLabels VARCHAR(220)
select @ShipmentLabels = ShipmentNo from openquery([SERVER_IP], 'SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo = ''G015246''')
--FROM dbo.PoHdr WHERE PoNo = @PoNo
-- Return the result of the functionRETURN ISNULL(@ShipmentLabels, @PO)
END
Essayer une autre façon de requête d'écriture maintenant, cela ne fonctionne pas FYI:
Declare @TSQL VarChar(8000)
set @TSQL = N'select @ShipmentLabels = ShipmentNo from openquery([SERVER_IP],SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo =' + @PO +''
exec sp_executesql @TSQL, N'@ShipmentLabels output', @ShipmentLabels = @ShipmentLabels out
Je n'ai jamais essayé cela - mais avez-vous essayé sans les guillemets? '@CpPoNo = '@ PO''' SQL Server lit votre paramètre comme un littéral de chaîne (VARCHAR) de la façon dont vous l'avez, je suis assez sûr. – scsimon
Je ne le fais peut-être pas correctement, mais '@CpPoNo = '@ PO''' et' @CpPoNo = @ PO'' ne s'exécuteront pas. Ce dernier donne une erreur renvoyée message ... "Préparation différée n'a pas pu être complétée.". Msg 8180, niveau 16, état 1, ligne 1 Énoncé (s) n'a pas pu être préparé. Msg 137, niveau 15, état 2, ligne 1 Doit déclarer la variable scalaire "@PO". – user1869407
Je viens de remarquer que c'est dans votre SP. vous avez juste besoin de concaténer avec +. '@CpPoNo = '+ @ PO' – scsimon