2016-02-12 58 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