SQL 服务器创建临时函数作为 CTE

hey*_*Now 5 sql-server cte functions

我需要创建一个临时函数,用于更大的查询,但我没有对数据库的创建权限(#TEMP 表除外)。

有什么方法可以为此目的使用 CTE 或 #temp 查询。也许我在这里遗漏了一些非常简单的东西。

示例(它可能是什么样子):-

with add1(x) as
  return x+1

select add1(v.Value1), add1(v.Value2)
from Values v
Run Code Online (Sandbox Code Playgroud)

值表

Id Value1 Value2
1  1       4
2  2       5
3  3       6
Run Code Online (Sandbox Code Playgroud)

编辑

根据 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
Run Code Online (Sandbox Code Playgroud)

决赛PIVOT虽然搞砸了结果。我想知道为什么需要这样做。

我仍然试图将我的头围绕在UNPIVOT和的各个部分PIVOT


编辑2

请看我的回答,
我让它在我们只需要处理列的地方工作..

Aar*_*and 5

要复制这种代码,而不创建函数:

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);
Run Code Online (Sandbox Code Playgroud)

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

如果函数非常复杂,不想重复,这就是实际问题,可以试试这个解决方案。它很复杂,但只允许您编写一次函数。如果您需要将其扩展到两列以上,它会变得更加复杂。

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;
Run Code Online (Sandbox Code Playgroud)

或者您可以请求在某处创建您的函数的权限。

  • 非常感谢@AMtwo,当我写了那个转轴/反转轴查询时,他坐在我旁边,每次我输入错误的语法时都会拍拍我的手。这是很多。 (2认同)