sqlserver批量插入數據
① sqlSERVER 批量導入EXCEL文件數據
SQL批量導入exe文件數據的話,直接從批量導入就好了。
② 怎樣向SQL Server中大批量插入數據
一次性插入大量數據,只能使用循環,
如:游標,while 循環語句
下面介紹While 循環插入數據,
SQL 代碼如下:
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 5000000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
--以上函數取自Inside SQL Server 2005: T-SQL Query一書。
INSERT dbo.Sample SELECT n, RAND(CAST(NEWID() AS BINARY(16))) FROM Nums
③ 如何在SQLserver中利用循環語句插入大量的數據
這個在sqlserver裡面不好做,要用到sql語言中的變數並且sql語音沒有for不過有while,不過一般數據都不會這樣批量輸入,畢竟不是每條數據都之間都存在內在的聯系。如果你真的想用for語句進行錄入的話,你就用visual studio連接你的資料庫用c#代碼來完成這個活。
DECLARE @id INT,@username NVARCHAR(50),@Pwd NVARCHAR(50)
SET @id=0
SET @username ='kk'
SET @Pwd='12345'
WHILE @i<10000 --10000為你要執行插入的次數
BEGIN
INSERT INTO xx ( id, username,Pwd ) --xx為表名
VALUES ( @id, @username,@Pwd )
SET @i=@i+1
END
④ SQLSERVER資料庫中批量導入數據的幾種方法
我們通過SQL腳本來插入數據,常見如下四種方式。
方式一:一條一條插入,性能最差,不建議使用。
INSERT INTO Proct(Id,Name,Price) VALUES(newid(),'牛欄1段',160);INSERT INTO Proct(Id,Name,Price) VALUES(newid(),'牛欄2段',260);
......
方式二:insert bulk
語法如下:
方式四:拼接SQL
INSERT INTO Proct(Id,Name,Price) VALUES(newid(),'牛欄1段',160)
,(newid(),'牛欄2段',260)
......
⑤ 提高Sqlserver大批量插入數據速度的幾點方法
這個可以藉助系統表,一次插入多條的方式,來達到減少插入的次數,來達到大批量插入數據的方法。
⑥ sql server怎麼批量導入
在SQL Server中集成了很多成批導入數據的方法。
一、使用Select Into語句
若企業資料庫都採用的是SQL Server資料庫的話,則可以利用Select Into語句來實現數據的導入。Select Into語句,作用就是把數據從另外一個資料庫中查詢出來,然後加入到某個用戶指定的表中。
在使用這條語句的時候,需要注意幾個方面的內容。
1、需要在目的資料庫中先建立相關的表。如想把進銷存系統資料庫(SQLServer)中的產品信息表(Proct)導入到ERP系統中的產品信息表(M_Proct)中。則前期是在ERP系統的資料庫中已經建立了這張產品信息表。
2、這種方法只復製表中的數據,而不復製表中的索引。如在進銷存系統數據中的產品信息表中,在產品編號、產品種類等欄位上建立了索引。則利用Select Into語句把數據復制到ERP系統的表中的時候,只是復制了數據內容的本身,而不會復制索引等信息。
3、這條語句使用具有局限性。一般情況下,這只能夠在SQL Server資料庫中採用。不過,對於SQL Server不同版本的資料庫,如2008或者2003,還都是兼容的。若需要導入的對象資料庫不是SQL Server的,則需要採用其他的方法。
4、採用這條語句的話,在目的表中必須不存在數據。否則的話,目的表中的數據會被清除。也就是說,這個語句不支持表與表數據的合並。在SQL Server中,有一條類似的語句,可以實現這個功能。這條語句就是:Insert Into。作用就是把另外一張表中的數據插入到當前表中。若用戶想要的時表與表數據的合並,則可以採用這條語句。兩者不能夠混淆使用,否則的話,很容 易導致數據的丟失。
5、以上兩條語句都支持兼容的不同類型的數據類型。如在原標中,某個欄位的數據類型是整數型,但是在目的表中這個欄位的數據類型則是浮點型,只要這個兩個數據類型本來就兼容的,則在導入的時候,資料庫是允許的。
另外再補上一個小技巧:
想復製表a的所有欄位名到一個新表b的時候,可以使用以下方法:
1)select * into b from a where 1<>1 (僅SQL Server可用)
2)select top 0 * into b from a
二、利用Excel等中間工具進行控制
1、雖然第一種方法操作起來比較簡單,但是其也有一些缺點。如只支持同一種類型的資料庫;不能夠對數據進行過多的干預等等。一般情況下,若用戶原數據准確度比較高,不需要過多的修改就可以直接拿來用的話,則就已採用第一種方式。
2、但是,若在原資料庫中,數據的准確度不是很高,又或者,有很多數據是報廢的。總之,需要對原資料庫的數據進行整理,才能夠使用的情況,不建議先導入進去,再進行更改。在遇到這種情況時,喜歡利用Excle作為中間工具。也就是說,先把數據中原資料庫中導到Excle中。有些資料庫,如 Oracle資料庫,不支持Excle格式。但是,可以導為CSV格式的文件。這種文件Excle也可以打得開。
3、然後,再在Excle中,對記錄進行修改。由於Excle是一個很強的表格處理軟體,所以,其數據修改,要比在資料庫中直接修改來得方便,來得簡 單。如可以利用按時間排序等功能,把一些長久不用的記錄清楚掉。也可以利用替換等功能,把一些不規范的字元更改掉。這些原來在資料庫中比較復雜的任務,在 Excle等工具中都可以輕松的完成。
4、等到表中的內容修改無誤後,資料庫管理員就可以把Excle表格中的文件直接導入到SQL Server資料庫中。由於SQL Server與Excel是同一個父母生的,所以,之間的兼容性很好。在Sql Server中提供了直接從Excel文件中導入數據的工具。
5、雖然這要藉助中間工具導入數據,但是,因為其處理起來方便、直觀,所以,在大部分時候都是採用這種方式。
最後,再附上如何讓Excel表格在資料庫中能查看到的相關代碼:
execsp_addlinkedserver'excel','ex','Microsoft.Jet.OLEDB.4.0','C:桌面abc.xls',null,'Excel5.0'--創建一個名為excel的連接服務,可以查看到abc.xls裡面的內容
EXECsp_addlinkedsrvlogin'excel','false','sa','Admin',NULL--創建一個映射以允許SQLServer登錄sa使用Excel登錄Admin連接到excel,並且沒有密碼
--execsp_dropserver'excel'--刪除連接
select*fromexcel...Sheet1$--查看Excel的Sheet1表裡面的內容
⑦ c#怎樣向sqlserver批量插入數據
C#和MS SQL交互使用的技術叫做 ADO.NET。 使用ADO.NET可以方便的對SQL SERVER 進行操作。
(如果你對ADO.NET不了解,建議先MSDN一下)
批量插入數據,有兩種方式,
1,數據比較復雜但是量不是很大,(這個大小的概念要視你的硬體、網路而定,一般在100萬條以上才叫大)。
使用FOR循環進行插入, 即聲明連接(conn.Open)然後進行遍歷,
一條一條插入資料庫(執行Insert語句),
一般來說,100W條數據,如果插入本機資料庫的話, 耗時一般在40S-1分鍾左右,
也可以在SqlServer中創建一個存儲過程來執行Insert命令, 遍歷時只需要調用存儲過程即可, 存儲過程的執行效率比Sql語句要高很多,因為不需要每次都編譯。
100W條數據用存儲過程來執行的話,一般耗時在20S左右,。
2數據量巨大,但是類型較簡單,(一般指上百萬條數據)
使用ADO.NET提供的BulkCopy,即批量導入,
語法:
publicstaticvoidBulkToDB(DataTabledt,stringTableName)
{
SqlConnectionsqlConn=newSqlConnection(
ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString);
SqlBulkCopybulkCopy=newSqlBulkCopy(sqlConn);
bulkCopy.BulkCopyTimeout=600;
bulkCopy.DestinationTableName=TableName;
bulkCopy.BatchSize=dt.Rows.Count;
try
{
sqlConn.Open();
if(dt!=null&&dt.Rows.Count!=0)
bulkCopy.WriteToServer(dt);
}
catch(Exceptionex)
{
throwex;
}
finally
{
sqlConn.Close();
if(bulkCopy!=null)
bulkCopy.Close();
}
}
需要傳入一個DataTable,一個表名。
這種方式速度非常快,同樣100W條數據,本機導入,大概3-5秒就可以完成,
但是需要注意,傳入的DataTable必須和Sql Server中的表結構一模一樣,
比如你的表有3列,分別是Name, Age, Sex。 你傳入的DataTable也必須是如此,所以這種方式只適合導入一些基礎數據, 並不適合作為數據層的常用方法。
如果數據量巨大又要求很高的效率,更建議使用NoSql資料庫
⑧ 怎樣快速向sqlserver插入上億條數據
步驟如下:
1. 建新表(t2);
2. 將舊表t數據插入到新表t2;
3. 將舊表刪除;
4. 重建約束和索引;
其實事情已經做完了, 2億7千萬條數據存儲過程分批插入大概3小時完成, 只是探索一下:
有無更好更方便的方式來做這個事情
⑨ 如何在SQL Server中批量導入數據
方案一、循環導入
實現方式是利用資料庫訪問類調用存儲過程,利用循環逐條插入。很明顯,這種方式效率並不高
方案二、使用Bulk插入
bulk方法主要思想是通過在客戶端把數據都緩存在Table中,然後利用SqlBulkCopy一次性把Table中的數據插入到資料庫,效率非常高
方案三:
利用SQLServer2008的新特性--表值參數(Table-Valued Parameter)。表值參數是SQLServer2008才有的一個新特性,使用這個新特性,我們可以把一個表類型作為參數傳遞到函數或存儲過程里。
方案四:
對於單列欄位,可以把要插入的數據進行字元串拼接,最後再在存儲過程中拆分成數組,然後逐條插入。查了一下存儲過程中參數的字元串的最大長度,然後除以欄位的長度,算出一個值,很明顯是可以滿足要求的,只是這種方式跟第一種方式比起來,似乎沒什麼提高,因為原理都是一樣的。
方案五:
考慮非同步創建、消息隊列等等。這種方案無論從設計上還是開發上,難度都是有的。
⑩ 如何高效地批量導入數據到SqlServer
2.SqlBulkCopy是個不錯的選擇,直接由DataTable可以導入到資料庫
,但要注意(1)列名與目標表一致(2)數據類型一致(3)空值容錯處理,參考代碼:///<summary///將<see cref="DataTable"/
的數據批量插入到資料庫中。///</summary///<param name="dataTable"
要批量插入的
<see cref="DataTable"/。
</param///<param name="batchSize"
每批次寫入的數據量。
</(DataTable dataTable,
stringtableName,
intbatchSize =10000){using(SqlConnection connection =newSqlConnection(myConnectionString)){try{connection.Open();//給表名加上前後導符using(varbulk =newSqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity,
null){DestinationTableName=tableName,
BatchSize=batchSize}){//循環所有列,為bulk添加映射//dataTable.EachColumn(c = bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c = !c.AutoIncrement);foreach(DataColumn dcindataTable.Columns){bulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);}bulk.WriteToServer(dataTable);
bulk.Close();}returntrue;}catch(Exception exp){returnfalse;}finally{connection.Close();}}}
3.如果是數據量非常大,超過10W以上的數據,可以考慮生成.dtsx文件,然後由C#代碼直接調用,效率還是不錯的。