Я пытаюсь динамически вставить определенное количество строк в мою базу данных на основе параметра первой строки и параметра последней строки. Вот что я попробовал, и в итоге в мою базу данных было вставлено 49 000 строк - все с одинаковыми значениями - MyName-10.

@NamePrefix nvarchar(25)
, @FirstRow int -- Begin with this number  (10)
, @LastRow int --End with this number (15)

AS
BEGIN
  IF @LastRow IS NOT NULL 
  BEGIN
    DECLARE @i int = @FirstRow
    WHILE (@i <= @LastRow)
      INSERT INTO MyTable (Name)
        VALUES (@NamePrefix + Cast(@i AS varchar))
    SET @i = @i + 1;
  END
END

Результаты моей таблицы должны выглядеть так:

Name:
MyName-10
MyName-11
MyName-12
MyName-13
MyName-14
MyName-15
0
Shane 12 Фев 2020 в 23:14

2 ответа

Лучший ответ

Предположительно, вы намерены:

WHILE (@i <= @LastRow)
BEGIN
  INSERT INTO MyTable (Name)
    VALUES (@NamePrefix + Cast(@i AS varchar(255)));
  SET @i = @i + 1;
END;
1
Gordon Linoff 12 Фев 2020 в 20:16

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

Я держу таблицу подсчета в качестве представления моей системы, но вы можете сделать это встроенным с парой ctes или чем-то еще. Вот код для моей таблицы.

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
GO

Теперь для вставок, которые вы пытаетесь сделать, это становится безболезненным, мгновенным и без петель.

declare @NamePrefix nvarchar(25) = 'MyName-'
    , @FirstRow int = 10 -- Begin with this number  (10)
    , @LastRow int = 15 --End with this number (15)

INSERT INTO MyTable (Name)
select @NamePrefix + Cast(t.N AS varchar(10))
from cteTally t
where t.N >= @FirstRow
    and t.N <= @LastRow
2
Sean Lange 12 Фев 2020 в 20:37