T SQL - вставка строк в диапазоне целых чисел - PullRequest
0 голосов
/ 02 марта 2020

Я создаю SPRO C, который будет принимать число в качестве параметра. Мне нужно взять это число и получить 2 числа до него и 2 числа после него, а затем вставить их во временную таблицу. Например - int 355. Мне нужно написать состояние вставки enet, которое вставляет 353, 354, 355, 356 и 357. (-2 и +2). Я не совсем уверен, как это сделать. Я думал, может быть, курсор? В C# я бы сделал для l oop, но я не уверен, как правильно подходить на заданном языке. Спасибо!

Вот что у меня есть:

CREATE PROCEDURE [dbo].[GetLanePrediction]
    @startzip int
AS
BEGIN
    --SET NOCOUNT ON;
    DECLARE @posnegval int = 2
    DECLARE @TempZips TABLE (ID INT IDENTITY(1,1), Zip INT)

    --INSERT INTO @TempZips (Zip)
    --Some kind of for loop or cursor here?

END

В результате получится временная таблица (@TempZips) с 5 строками. Вот так:

ID     Zip
1      353
2      354
3      355
4      356
5      357

Ответы [ 2 ]

4 голосов
/ 02 марта 2020

Вот один простой метод , основанный на вопросе :

CREATE PROCEDURE [dbo].[GetLanePrediction] (
    @onenumber int
) AS
BEGIN
    DECLARE @TempZips TABLE (ID INT IDENTITY(1,1), Zip INT)

    INSERT INTO @TempZips (Zip)
        SELECT one_number + v.n
        FROM (VALUES (-2), (-1), (0), (1), (2)) v(n);

END;

РЕДАКТИРОВАТЬ:

Вы также можете использовать рекурсивный CTE:

;WITH n as (
      SELECT -@posnegval as n
      UNION ALL
      SELECT n + 1
      FROM n
      WHERE n < @posnegval
     )
INSERT INTO @TempZips (Zip)
    SELECT @onenumber + n.n
    FROM n
    -- WITH OPTION (maxrecursion 0);  -- only needed if you'll ever have more than 100 numbers
1 голос
/ 02 марта 2020

Просто еще один вариант с использованием ad-ho c таблицы подсчета

Declare @I int =355
Declare @R int =2

Select ID = N 
      ,Zip= -1+@I-@R+N
 From ( Select Top ((@R*2)+1) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1 ) A

Возвращает

ID  Zip
1   353
2   354
3   355
4   356
5   357
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...