Как вставить несколько строк - нужен цикл? - PullRequest
3 голосов
/ 19 марта 2012

У меня есть следующее утверждение:

insert into forecast_entry.user_role_xref
        ( user_master_id ,
          role_id ,
          created_date ,
          created_by
        )
values
        ( 276 , -- user_master_id - int
          101 , -- role_id - int
          getdate() , -- created_date - datetime
          'MICHAELSK'  -- created_by - varchar(20)
        )

Мне нужно сгенерировать строку для role_id 101-355 (поэтому то же самое утверждение выше, за исключением повторения с приращением role_id). Каков был бы лучший способ сделать это? Чтобы выполнить работу, я собираюсь написать быстрое приложение на C #, которое будет иметь цикл, но я уверен, что это не лучший способ, и надеюсь узнать что-то здесь, чтобы избежать необходимости делать это в будущем (как я я уверен, что такой сценарий распространен).

Ответы [ 5 ]

10 голосов
/ 21 марта 2013

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

USE MyDB

GO

DECLARE @MyCounter as INT

SET @MyCounter = 1  -- to use this multiple times you can just

                    -- change the starting number and run again
                    -- if you do not want duplicate numbers

WHILE @MyCounter < 1000  -- any value you want

 BEGIN

    INSERT INTO [MyDB].[dbo].[MyTable]
        ([NumberField])
    VALUES
        (@MyCounter)  -- insert counter value into table

        set @MyCounter = @MyCounter + 1;  -- increment counter

END
6 голосов
/ 19 марта 2012

Вы должны использовать таблицу чисел , а если у вас ее нет, вы можете использовать master..spt_values следующим образом:

insert into forecast_entry.user_role_xref
        ( user_master_id ,
          role_id ,
          created_date ,
          created_by
        )
select 276, -- user_master_id - int
       number, -- role_id - int
       getdate() , -- created_date - datetime
       'MICHAELSK'  -- created_by - varchar(20)
from master..spt_values
where type = 'P' and
      number between 101 and 355
2 голосов
/ 19 марта 2012

На мой взгляд, лучший способ - создать хранимую процедуру. В хранимой процедуре вы должны сделать цикл, который бы вставлял данные в таблицу. Из приложения C # вы открываете соединение с БД, вызываете один раз хранимую процедуру и закрываете соединение. На SQL вы получаете лучшую производительность при работе с большим количеством данных.

Вот пример

1 голос
/ 19 марта 2012

Вместо зацикливания запроса Создайте DataTable и создайте stored procedure с User Defined Table Type

CREATE TYPE dtl AS TABLE
( 
          user_master_id INT ,
          role_id INT,
          created_date DATETIME,
          created_by varchar(20)

)

И хранимой процедурой

CREATE PROCEDURE SPNAME 
@dtl dtl READONLY
AS
INSERT INTO forecast_entry.user_role_xref
        ( user_master_id ,
          role_id ,
          created_date ,
          created_by
        )
SELECT 
          user_master_id ,
          role_id ,
          created_date ,
          created_by
FROM @dtl

Передайте DatatTable для параметра @dtl изхранимая процедура, которая содержит правильные данные в диапазоне 101-255

1 голос
/ 19 марта 2012

если вы создаете цикл в c #, он будет снова и снова отправлять один и тот же запрос в базу данных, что не очень хорошая идея. Лучше создать там sp и loop.как предположил Шам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...