我有一個由多個組/行程等使用的程序呼叫。
該呼叫的作業原理如下:
EXEC LWP_PAYMENT_URL @order_no, @dept
它回傳一個這樣的字串
NzI2NzU4NabNzEyMj24Ny1zYQ=
我被分配創建一個 url 路徑,如下所示
DECLARE @url_path VARCHAR(4000)
SET @url_path = 'https://www.website.com/payment?code='
DECLARE @ReturnValue VARCHAR(4000) = ''
EXEC @ReturnValue = LWP_PAYMENT_URL @order_no, @dept
SET @url_path = @url_path @ReturnValue
SELECT @ReturnValue, @url_path
我的目標是獲取硬編碼url_path并從執行中獲取編碼字串并將其保存在變數中并將其連接到url_path.
我看到的是字串是執行呼叫的一部分而不是設定它@ReturnValue,然后看起來我得到一個零值被保存和連接。
添加了這些是LWP_PAYMENT_URL程式的最后兩行。
DECLARE @Encoded VARCHAR(500) = CONVERT(VARCHAR(500), (SELECT CONVERT(VARBINARY, @string) FOR XML PATH(''), BINARY BASE64))
SELECT @Encoded AS [Encoded]
謝謝
uj5u.com熱心網友回復:
您的存盤程序應該這樣做:
CREATE OR ALTER PROCEDURE dbo.LWP_PAYMENT_URL
...@input parameters...,
@encoded varchar(500) = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
...
SET @Encoded = CONVERT(varchar(500),
(SELECT CONVERT(VARBINARY, @string) FOR XML PATH(''), BINARY BASE64));
END
然后來電者說:
DECLARE @ReturnValue varchar(500);
EXEC dbo.LWP_PAYMENT_URL @order_no, @dept,
@Encoded = @ReturnValue output;
如果您無法更改存盤程序,請創建一個單獨的存盤程序,或者按照評論中的建議創建一個表值 UDF,或者(假設SELECT在我們看不到的程序中沒有其他 s):
CREATE TABLE #foo(ReturnValue varchar(500));
INSERT #foo EXEC dbo.LWP_PAYMENT_URL ...;
DECLARE @ReturnValue varchar(500);
SELECT @ReturnValue = ReturnValue FROM #foo;
不過,這很嚴重,而且基本上是在濫用資料共享在 SQL Server 中的作業方式。
理想情況下,您應該做的是,如果所有用途的邏輯都相同,則將該邏輯放在某種更易于重用的模塊中(例如表值函式)。然后這個現有的存盤程序可以保持當前的行為(除了它會呼叫函式而不是在本地執行計算),你可以創建一個不同的存盤程序(或者直接呼叫函式,如果這就是你的代碼正在做的) ,而且邏輯不必重復,也不必踐踏它們的存盤程序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/527209.html
