T- sql Объедините переменные для использования в цикле Insert Into while - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать оператор SQL, который позволяет мне сэкономить время при создании серии CTE или временных таблиц, которые одинаковы и увеличиваются только в определенных местах. Я мог бы сделать это с VBA, но я не могу понять, возможно ли это с SQL

Я пытаюсь запустить следующий код

DECLARE @N as INT
DECLARE @POINTS as TABLE(ID int Not Null,n varchar(3) Not Null)
DECLARE @TABLENAME varchar(6)

Set @INC = 1
Set @N = 5

--WHILE @INC <= @N
--BEGIN

Declare @N1 INT
Declare @N2 INT
Declare @N3 INT
Declare @N4 INT
Declare @N5 INT
SET @N1=25
SET @N2=50
SET @N3=100
SET @N4=250
SET @N5=500
--END

WHILE @INC <= @N
    BEGIN
        INSERT INTO @POINTS(ID, n) 
        VALUES (@INC, CONCAT('@N',@INC))
        SET @INC = @INC + 1
    END

Select * from @POINTS

Вот результаты кода после его выполнения:

ID  n
1   @N1
2   @N2
3   @N3
4   @N4
5   @N5

Можно ли вставить значения, заданные мной для каждой переменной @Nx, в столбец n вместо объединенных значений символов? Если так, то как? Я не смог найти никаких результатов о ком-то, кто пытался это сделать.

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

1 Ответ

0 голосов
/ 29 апреля 2020

Если у вас только небольшое количество значений, вы также можете написать одну инструкцию вставки, которая вставит все 5 строк в таблицу:

INSERT INTO @POINTS(ID, n) VALUES 
(1, '5'), 
(2, '25'), 
(3, '50'),
(4, '100'),
(5, '250'),
(6, '500');

Если у вас слишком много значений для записи например, вы можете использовать cte для генерации встроенной таблицы и использовать insert...select из этой таблицы:

DECLARE @Points as TABLE
(
    ID int Not Null,
    n varchar(3) Not Null
);

WITH E10(N) AS
(
    SELECT 1 
    FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9))V(N)
), Tally(N) AS
(
    -- Since all the numbers are multiples of 5, 
    -- there's no point of populating the tally
    -- with numbers that aren't multiples of 5....
    SELECT ROW_NUMBER() OVER(ORDER BY @@SPID) * 5
    FROM E10 As Ten
    CROSS JOIN E10 As Hundred
    --Need more? Add more cross joins 
    -- each will multiply the number of rows by 10:
    --CROSS JOIN E10 As Thousand
    --CROSS JOIN E10 As [Ten Thousand] -- and so on    
)

INSERT INTO @Points(ID, n) 
SELECT ROW_NUMBER() OVER(ORDER BY N), CAST(N as varchar(3))
FROM Tally
WHERE N IN(5, 25, 50, 100, 250, 500);

SELECT *
FROM @Points;

Результаты:

ID  n
1   5
2   25
3   50
4   100
5   250
6   500

Конечно, если вы уже есть таблица подсчета, вам не нужен cte ...

...