2012-03-19 50 views
3

我有以下聲明:如何插入多行 - 需要一個循環?

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#應用​​程序,但是我相信這不是最好的方法,並且希望在這裏學習一些東西以避免在將來這樣做(正如我'確定這種情況很常見)。

回答

6

你應該做的numbers table使用,如果你沒有一個你可以使用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 
+3

+1對於數字表方法。但要小心'master..spt_values'。我不會在生產代碼中使用它。見http://stackoverflow.com/questions/4273723/what-is-the-purpose-of-system-table-table-master-spt-values-and-what-are-the-me,http:// social .msdn.microsoft.com/Forums/zh-CN/transactsql/thread/a7cc9252-a1d1-4f51-9c35-7cd9720b507c,http://www.dbforums.com/microsoft-sql-server/1660575-using-master-dbo -spt_values-dangerous.html – 2012-03-19 08:20:31

+0

@TomekSzpakowicz - 很好的建議。不要在生產代碼中使用'master..spt_values'。 – 2012-03-19 10:06:50

2

在我看來,最好的方法是創建存儲過程。在存儲過程中,您應該創建一個循環,將數據插入到表中。從您的C#應用​​程序中打開到DB的連接,調用一次存儲過程並關閉連接。 在SQL上,您可以獲得使用大量數據的最佳性能。

Here is an example

1

如果C#創建一個循環,將一次又一次地發送相同的查詢數據庫,這是不是一個好idea.you而創建SP和循環出現。通過假的建議

1

相反循環查詢創建DataTable和創造的stored procedureUser 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 for @dtl存儲過程的參數,它包含101-255之間的正確數據

8

這裏是我使用的,只是根據需要進行修改。在這裏,我使用循環變量向表中添加了一堆序列號:

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