2014-08-29 167 views
0

我有一個標量SQL函數,它返回一個十進制值,並且此函數在我的數據庫中的許多存儲過程中使用。現在在一些程序中,我需要根據函數內的一些標準設置一個值。爲了使它更清晰,根據用於計算函數結果的一些變量,我想在存儲過程中設置另一個變量,並將其返回給客戶端。從標量SQL函數返回兩個值

我不想改變結果返回的方式或函數的返回類型。我正在考慮通過將我想要的新值插入到一個sql表中,然後從過程中讀取它來做到這一點,但有沒有其他更好的方法來做到這一點?

謝謝

回答

1

你有幾個選項

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) 
+0

謝謝,我發現有不是改變功能的表值函數,沒有別的辦法,因爲你不能在一個函數中做任何插入或更新。 – 2014-09-01 07:09:11

2

不,你不能。 SQL Server中的函數受到嚴重限制,不允許有任何副作用。

但是,您可以做的是將標量函數轉換爲表函數。在它中,您可以根據需要返回一個包含多個列的表,因此返回多個值不是問題。