Sql-Server
SQL Server 創建臨時函式作為 CTE
我需要創建一個臨時函式,用於更大的查詢,但我沒有數據庫的創建權限(#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;
或者您可以請求在某處創建函式的權限。