2016-12-29 2 views
-1

Вот моя проблема: у меня есть хранимая процедура в SQL Server 2012, которая должна сделать следующее.Вставка отдельных значений в таблицу на основе числа

Я передам входной параметр @Range, и хранимая процедура должна вставить значения в таблицу, начиная с 0 до @Range-1.

CREATE PROC MyExample 
    (@Range INT) 
AS 
BEGIN 
    // Suppose the value of @Range is 100 
    // So I should do INSERT into MyTable Values(0,1,2,3,4,5,6,......99) 
END 

Любая идея, как этого достичь?

+0

его, кажется, как домашнее задание, и это очень легко, просто добавить заявление вставки и isnide этого аргумента. добавив цикл – Moudiz

+0

Итак, вы хотите вставить на уровне строки или столбца. При просмотре вашего запроса кажется, что вы хотите вставить в это количество столбцов в зависимости от диапазона? Пожалуйста, уточните –

ответ

0

Я имею в виду ваш учитель может заподозрить, почему вы используете КТР, когда вы только учитесь цикл

CREATE PROC MyExample 
(
    @Range INT, 
) 
AS 
BEGIN 
    ;WITH numbers AS 
    ( 
     SELECT 0 AS Value WHERE @Range >= 0 -- Validate the @Range value too, try 0 or negative values 
     UNION ALL SELECT Value + 1 FROM numbers WHERE Value + 1 < @Range 
    ) 
    INSERT INTO MyTable 
    SELECT * FROM numbers 
    OPTION (MAXRECURSION 0) 
END 
+0

спасибо тонну! работал отлично. Будут делать и оценки для диапазона. Спасибо :) –

2

Вы можете использовать в то время как цикл, как показано ниже:

Declare @Index AS INT=0 

WHILE @Index<@Range 
BEGIN 
    INSERT into MyTable Values(@Index) 
    SET @[email protected]+1 
END 
+0

Первоначально думал об этом ... Но глядя при вставке инструкции процедуры я думаю, что вставка должна произойти на уровне столбца. –

0
CREATE PROC MyExample 
(
    @Range INT, 
) 
AS 
BEGIN 
declare @RANGE_COUNT int 

select @RANGE_COUNT [email protected] 
    //Suppose the value of @Range is 100 
while @RANGE_COUNT<>0 
begin 
    //So I should do INSERT into MyTable Values(0,1,2,3,4,5,6,......99) 
    INSERT into MyTable Values(@Range) 
set @RANGE_COUNT = RANGE_COUNT -1 
end 
END 
+0

Это предложение имеет некоторые недостатки ... 1. Где вы устанавливаете начальное значение '@ RANGE_COUNT'? 2. Почему это числовое число вместо int? 3, ваше условие цикла неверно. 4. Ваша вставка неправильная - она ​​будет вставлять 100 каждый раз. –

+0

@ ZoharPeled проверить, пожалуйста, так как точка 4 не ясна из OP – Moudiz

+1

Я думаю, что это достаточно ясно - он хочет вставить числа между 0 и значением '@ Range'. отозвал мой downvote. –

0

И здесь представляет собой основанный на наборе подход:

CREATE PROC MyExample 
(
    @Range INT, 
) 
AS 
BEGIN 

    INSERT INTO MyTable (Number) 
    SELECT TOP (@Range) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 
    FROM sys.objects s1  
    CROSS JOIN sys.objects s2 
END 

(на основе this SO post)

0

Использование метода Tally таблицы:

DECLARE @range INT = 100 

SELECT TOP(@range) -1 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rn 
FROM 
    (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(n) CROSS JOIN --10 
    (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(n) CROSS JOIN --100 
    (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t3(n)   --1000 
    --...continue to cover all possible @range values 
+1

Я думаю, что '-1' должен быть на' row_number', так как OP попросил вставить значение '0', а также ... –

Смежные вопросы