2016-02-12 29 views
0

我需要创建一个表函数,该函数产生的参数总是从1开始的第1列中的指定数字。在第2列中,如果第1列可以被5整除,则会说'Div5',否则将会说'012'。 。内联表值函数

举个例子。我指定第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; 

我希望这给出足够的细节?

谢谢:)

回答

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

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

+0

让我的创作功能有点厚,但内容完美无缺! – Becky

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