Sql-Server

SQL Server 創建臨時函式作為 CTE

  • March 12, 2018

我需要創建一個臨時函式,用於更大的查詢,但我沒有數據庫的創建權限(#TEMP 表除外)。

有什麼方法可以為此目的使用 CTE 或 #temp 查詢。也許我在這裡錯過了一些非常簡單的東西。

範例(它的外觀):-

with add1(x) as
 return x+1

select add1(v.Value1), add1(v.Value2)
from Values v

值表

Id Value1 Value2
1  1       4
2  2       5
3  3       6

編輯

根據 Aaron Bertrand 的回答,我設法得到了一些工作。

CREATE TABLE #myTempTable
(
 id int identity(1,1) primary key, 
 amount  int, 
 col1  varchar(10),
 col2 varchar(4)

);
-- quite a few more cols in my actual temp table,  
-- omitted to show the real issue

INSERT #myTempTable(amount,col1, col2) VALUES(10,'a1', 'b1'),(15,'a2','b2');

;WITH processed AS 
(
 SELECT * FROM #myTempTable AS r
 UNPIVOT (Result FOR [Value] IN r.Amount) unp
 CROSS APPLY
 ( 

    /******** COMPLEX FUNCTION HERE ********/
    /**** Applies to output of unpivot *****/

    SELECT unp.Result + 10 [Processed_amount]

 ) AS a
 --PIVOT (max(orig) FOR Value IN ( amount)) AS p2
)

select top 10 [Processed_amount], * from processed

決賽PIVOT雖然搞砸了結果。我想知道為什麼需要這樣做。

我仍在嘗試圍繞 和 的各個UNPIVOT部分PIVOT


編輯2

請看我的回答,

我讓它在我們只需要處理列的地方工作..

要複製這種程式碼,而不創建函式:

CREATE FUNCTION dbo.add1(@x int)
RETURNS int
AS
BEGIN
 RETURN (SELECT @x + 1);
END
GO

SELECT dbo.add1(v.Value1), dbo.add1(v.Value2)
FROM (VALUES(1,2),(3,4)) AS v(Value1, Value2);

您可以使用CROSS APPLY

SELECT z.v1, z.v2
FROM (VALUES(1,2),(3,4)) AS v(Value1, Value2)
CROSS APPLY
(
 SELECT v.Value1 + 1, v.Value2 + 1
) AS z(v1,v2);

如果該功能非常複雜,您不想重複它,這是實際問題,您可以嘗試此解決方案。它很複雜,但只允許您編寫一次函式。如果您需要將其擴展到兩列以上,它會變得更加複雜。

CREATE TABLE #vals
(
 id int identity(1,1) primary key, 
 a  int, 
 b  int
);

INSERT #vals(a,b) VALUES(1,2),(15,16);

;WITH vals AS 
(
 SELECT * FROM #vals AS v
 UNPIVOT (Result FOR [Value] IN (a,b)) unp
 CROSS APPLY
 ( 

    /******** COMPLEX FUNCTION HERE ********/
    /**** Applies to output of unpivot *****/
    SELECT unp.Result + 10

 ) AS new(orig)
 PIVOT (MAX(orig) FOR Value IN ([a],[b])) AS p2
)
SELECT v1.id, 
 OriginalValue1 = v1.Result, 
 Value1 = v1.a, 
 OriginalValue2 = v2.Result, 
 Value2 = v2.b 
FROM vals AS v1 
JOIN vals AS v2 ON v1.id = v2.id
AND v1.a IS NOT NULL
AND v2.b IS NOT NULL;

GO
DROP TABLE #vals;

或者您可以請求在某處創建函式的權限。

引用自:https://dba.stackexchange.com/questions/199427