我有一個標量SQL函數,它返回一個十進制值,並且此函數在我的數據庫中的許多存儲過程中使用。現在在一些程序中,我需要根據函數內的一些標準設置一個值。爲了使它更清晰,根據用於計算函數結果的一些變量,我想在存儲過程中設置另一個變量,並將其返回給客戶端。從標量SQL函數返回兩個值
我不想改變結果返回的方式或函數的返回類型。我正在考慮通過將我想要的新值插入到一個sql表中,然後從過程中讀取它來做到這一點,但有沒有其他更好的方法來做到這一點?
謝謝
我有一個標量SQL函數,它返回一個十進制值,並且此函數在我的數據庫中的許多存儲過程中使用。現在在一些程序中,我需要根據函數內的一些標準設置一個值。爲了使它更清晰,根據用於計算函數結果的一些變量,我想在存儲過程中設置另一個變量,並將其返回給客戶端。從標量SQL函數返回兩個值
我不想改變結果返回的方式或函數的返回類型。我正在考慮通過將我想要的新值插入到一個sql表中,然後從過程中讀取它來做到這一點,但有沒有其他更好的方法來做到這一點?
謝謝
你有幾個選項
1)從函數將其更改爲一個存儲過程,並添加一個輸出參數。
2)將其從標量函數更改爲返回單行的表值函數,並將附加值作爲附加列。
如果您需要保留現有的函數簽名,那麼只需創建一個新的表值函數來完成工作(根據上面的選項2),並修改您現有的函數以從新的表值函數中進行選擇。
下面是一些示例代碼展示了這一點:
-- the original scalar function
CREATE FUNCTION dbo.t1(@param1 INT)
RETURNS INT AS
BEGIN
RETURN @param1 + 1
END
GO
-- a new table valued function, that returns 2 values in a single row
CREATE FUNCTION dbo.t2(@param1 INT)
RETURNS TABLE AS
RETURN (SELECT @param1 + 1 AS [r1], @param1 + 2 AS [r2])
GO
-- the modified original function, now selecting from the new table valued function
CREATE FUNCTION dbo.t3(@param1 INT)
RETURNS INT AS
BEGIN
RETURN (SELECT r1 FROM dbo.t2(@param1))
END
GO
-- example usage
SELECT dbo.t1(1)
SELECT * FROM dbo.t2(1)
SELECT dbo.t3(1)
不,你不能。 SQL Server中的函數受到嚴重限制,不允許有任何副作用。
但是,您可以做的是將標量函數轉換爲表函數。在它中,您可以根據需要返回一個包含多個列的表,因此返回多個值不是問題。
謝謝,我發現有不是改變功能的表值函數,沒有別的辦法,因爲你不能在一個函數中做任何插入或更新。 – 2014-09-01 07:09:11