内联 table 值函数
Inline table valued function
我需要创建一个 table 函数,它在第 1 列中始终从 1 开始生成一个指定数量的参数。在第 2 列中,如果第 1 列可以被 5 整除,它将显示 'Div5' 否则 NULL
.
举个例子。我指定第 1 列将在 5 处停止,最终结果如下所示;
1 个空值
2 空
3 空
4 空
5 格 5
我可以创建函数,但我不确定如何创建条件第一列,或者如果第 2 列除以 5 是整数则 'Div5' 如果它是小数则 NULL ;
create function MyFunction ()
Returns @Division Table
(Ind int ,
Div5 varchar(30))
AS
begin
Insert Into @Division (Ind, Div5)
select ???,???
Return;
End;
我希望这提供了足够的细节?
谢谢:)
这应该可以解决问题:
DECLARE @divisor INT = 10, @limit INT = 100;
WITH
L0 AS(SELECT 1 AS C UNION ALL SELECT 1 AS O),
L1 AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS(SELECT 1 AS C FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS(SELECT 1 AS C FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS(SELECT 1 AS C FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS(SELECT 1 AS C FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L5)
SELECT N, CASE WHEN N % @divisor = 0 THEN 'Div' + CAST(@divisor AS VARCHAR(100)) ELSE NULL END AS Col2 FROM Nums
WHERE N <= @limit
这 2 个变量决定了您要查找的第一列可以整除的数字,第二列是您想要整除的数字,下一位只是一个 CTE,用于为第一列生成数字( numbers tables 对加载这样的东西非常有用)。然后它只是从数字 table 中选择所有数字直到你的限制和一个 case 表达式来检查它是否可以被你指定的数字整除(余数 0)和 DivX 位的一些字符串连接。
您应该能够轻松地将此逻辑集成到您的函数中。
您正在寻找基本上 returns 除法问题余数的模运算符。
DECLARE @SOMETBL TABLE (ROWNUM INT, DIVSTATUS CHAR(4))
INSERT @SOMETBL
(ROWNUM)
SELECT 1
UNION
SELECT 5
UNION
SELECT 2
UNION
SELECT 10
UPDATE @SOMETBL
SET DIVSTATUS = CASE WHEN ROWNUM%5 > 0 THEN NULL ELSE 'DIV5' END
SELECT * FROM @SOMETBL
我需要创建一个 table 函数,它在第 1 列中始终从 1 开始生成一个指定数量的参数。在第 2 列中,如果第 1 列可以被 5 整除,它将显示 'Div5' 否则 NULL
.
举个例子。我指定第 1 列将在 5 处停止,最终结果如下所示;
1 个空值
2 空
3 空
4 空
5 格 5
我可以创建函数,但我不确定如何创建条件第一列,或者如果第 2 列除以 5 是整数则 'Div5' 如果它是小数则 NULL ;
create function MyFunction ()
Returns @Division Table
(Ind int ,
Div5 varchar(30))
AS
begin
Insert Into @Division (Ind, Div5)
select ???,???
Return;
End;
我希望这提供了足够的细节?
谢谢:)
这应该可以解决问题:
DECLARE @divisor INT = 10, @limit INT = 100;
WITH
L0 AS(SELECT 1 AS C UNION ALL SELECT 1 AS O),
L1 AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS(SELECT 1 AS C FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS(SELECT 1 AS C FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS(SELECT 1 AS C FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS(SELECT 1 AS C FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L5)
SELECT N, CASE WHEN N % @divisor = 0 THEN 'Div' + CAST(@divisor AS VARCHAR(100)) ELSE NULL END AS Col2 FROM Nums
WHERE N <= @limit
这 2 个变量决定了您要查找的第一列可以整除的数字,第二列是您想要整除的数字,下一位只是一个 CTE,用于为第一列生成数字( numbers tables 对加载这样的东西非常有用)。然后它只是从数字 table 中选择所有数字直到你的限制和一个 case 表达式来检查它是否可以被你指定的数字整除(余数 0)和 DivX 位的一些字符串连接。
您应该能够轻松地将此逻辑集成到您的函数中。
您正在寻找基本上 returns 除法问题余数的模运算符。
DECLARE @SOMETBL TABLE (ROWNUM INT, DIVSTATUS CHAR(4))
INSERT @SOMETBL
(ROWNUM)
SELECT 1
UNION
SELECT 5
UNION
SELECT 2
UNION
SELECT 10
UPDATE @SOMETBL
SET DIVSTATUS = CASE WHEN ROWNUM%5 > 0 THEN NULL ELSE 'DIV5' END
SELECT * FROM @SOMETBL