このクエリ(スカラー関数)を実行すると、結果が得られます。出荷番号が返されます。私は、パラメータ@PO
でG015246
をスワップアウトしかしオープンクエリを使用してリンクサーバーに使用されている特定のVARCHAR値のパラメータをスワップする方法
select ShipmentNo from openquery([SERVER_IP], 'SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo = ''G015246''')
、:戻り値は、この変更にはnullになり、いくつかの理由で
select @ShipmentLabels = ShipmentNo from openquery([SERVER_IP], 'SET FMTONLY OFF EXEC GsvStaging.dbo.Paul_GetPoShippingLabels @CartId = NULL, @CpPoNo = ''@PO''')
。両方のための
マイreturn文は次のとおりです。@ShipmentLabels
が必要な戻り値です
RETURN ISNULL(@ShipmentLabels, @PO)
。それはnullであるため、代わりに@PO
を返します。その結果、正しいと思われるG015246
になります。
私は@PO
パラメータをSQL文にどのように追加したのですか?
機能(fnGetTheShippingLabels)呼び出すストアドプロシージャ: 私はこのSPが出発点である記述するための最良の方法を推測します。
ALTER PROCEDURE [dbo].[StartingSP]
@JobId INT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ErrorMsg VARCHAR(256)
SELECT OC.PoNo,
V.FirstName,
V.LastName,
dbo.fnGetTradeAppFacilityName(NULL,OC.PoNo) TradeAppFacilityName,
OC.ReportFileName, dbo.fnGetTheShippingLabels(NULL,OC.PoNo) ShippingLabels
FROM PoHdr P
INNER JOIN OrderConfirmation OC ON
OC.PoNo = P.PoNo
INNER JOIN CpVendor V ON
V.VendNo = P.VendNo
WHERE OC.JobId = @JobId
SELECT @ErrorMsg ErrorMsg
END
上記のように、この関数はSPのSELECT文にあります。
コンプリートスカラー関数:
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
今書き込みクエリの別の方法をしようと、これは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
私はこれを試したことがない - しかし、あなたは、引用符なしでそれを試してみましたか? '@CpPoNo = '@ PO''' SQL Serverはあなたのパラメータを文字列リテラル(VARCHAR)として読み込んでいます。 – scsimon
私はこの権利を行使しないかもしれませんが、 '@CpPoNo = '@ PO'''と' @CpPoNo = @ PO''は実行されません。後者はメッセージにエラーが返されました... "遅延された準備は完了できませんでした。" メッセージ8180、レベル16、状態1、行1 ステートメントを準備できませんでした。 メッセージ137、レベル15、状態2、行1 スカラー変数 "@PO"を宣言する必要があります。 – user1869407
私はあなたのSPにこれが気づいたばかりです。あなたは+でConcatする必要があります。 '@CpPoNo = '+ @ PO' – scsimon