2016-02-12 3 views
0

Мне нужно создать функцию таблицы, которая производит параметр до указанного числа в столбце 1, всегда начиная с 1. В столбце 2, если столбец 1 делится на 5, в противном случае будет указано «Div5» NULL ,Inline table value function

Как пример. Я указываю, что столбец 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, чтобы генерировать числа для первого столбца (таблицы чисел действительно полезны для таких нагрузок). Затем он просто выбирает все числа из таблицы чисел до вашего предела и выражение case, чтобы проверить, делится ли он на указанный вами номер (остаток 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