内联表值函数

时间:2016-02-12 16:31:02

标签: sql-server-2008 create-function

我需要创建一个表函数,在第1列中生成一个指定数字的参数,始终从1开始。在第2列中,如果第1列可以被5整除,它将说“< Div5'否则NULL

以此为例。我指定第1列将在5处停止,最终结果将如下所示;

1 NULL

2 NULL

3 NULL

4 NULL

5 Div5

我可以创建该功能,但我不确定如何创建条件第一列,或者如何说第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;

我希望这能提供足够的细节吗?

谢谢:)

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

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来生成第一列的数字(数字表)对于像这样的东西非常有用)。然后它只是从数字表中选择所有数字到你的极限和一个case表达式来检查它是否可以被你指定的数字整除(余数为0)和DivX位的一些字符串连接。

您应该可以轻松地将此逻辑集成到您的功能中。

答案 1 :(得分:0)

您正在寻找基本上返回除法问题剩余部分的Modulo运算符。

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