2013-10-16 25 views
1

從標量函數值是療法的方式是,我們可以在SQL標量函數有一個變量返回2個值回報2個SQL

ALTER FUNCTION [report].[fGetKPI] (@metricName AS VARCHAR(50)) 
RETURNS SMALLINT 
AS 
BEGIN 
    DECLARE 
     @kipId AS SMALLINT, 
     @metricId as SMALLINT; 

    SELECT TOP 1 @kipId = [KPI_Id], @metricId = [MetricId] FROM report.[KPIDetails] WHERE [MetricName] = @metricName; 

    IF (@kipId IS NULL OR @metricId IS NULL) 
     DECLARE @Error AS INT = dbo.fThrowError('No key found for the component "' + @metricName + '"'); 
    RETURN (select @kipId,@metricId); 
END 
+5

改爲使用多語句表值函數。 –

+0

我很好奇dbo.fThrowError的定義 –

+0

@martin,它只是通過錯誤,帶一個函數..這不會導致問題 – user2637506

回答

5

標量函數,顧名思義,返回一個值:

用戶定義的標量函數返回在RETURNS子句中定義的類型的單個數據值。

來源:Types of Functions on TechNet

如果要返回多於一個值,你應該使用一個表值函數。

你也可以嘗試以某種方式打包你的兩個SMALLINT值到一個INT或將它們轉換成一個帶有分隔符的字符串,但這可能會變得複雜並且不是真的(在大多數情況下)是必需的。

0

您可以重新編寫函數爲:

IF OBJECT_ID('[report].[fGetKPI]') IS NOT NULL 
DROP FUNCTION [report].[fGetKPI]; 
GO 
CREATE FUNCTION [report].[fGetKPI] (@metricName AS VARCHAR(50)) 
RETURNS TABLE 
AS 
RETURN 
SELECT TOP 1 [KPI_Id], [MetricId] FROM report.[KPIDetails] WHERE [MetricName] = @metricName; 
Go 

,然後再通過功能選擇數據使用dbo.fThrowError。希望這可以幫助!!!