我可以使用用户定义的表类型来插入大数据 [英] Can I use user defined table type for large data insertion

查看:86
本文介绍了我可以使用用户定义的表类型来插入大数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的 DataTable 中有大约50000条记录,我试图使用用户定义的表类型作为我存储过程中的一个参数。因为它花了太多时间插入并且我的应用程序被挂起了。



有人可以推荐我,怎么样我接近这个吗?



我的尝试:



< pre lang =sql> - 用户定义的表格类型:
CREATE TYPE [dbo]。[TYPE_INSERT_EXCELDATA] AS TABLE
[MERCHANT] [ nvarchar ]( 50 NOT NULL
[DEAL_ID] [ nvarchar ]( 50 NULL
[MODEL_NAME] [ nvarchar ]( 100 NOT NULL
[PRODUCT_URL] [ nvarchar ](max) NOT NULL
[LINE_RENTAL] [ nvarchar ]( 50 NULL
[IMAGE_URL] [ nvarchar ](max) NOT NULL
[CATEGORY_NAME] [ nvarchar ] ( 50 NOT NULL
[BRAND] [ nvarchar ]( 50 NOT NULL
[PRICE] [ float ] NOT NULL
[NETWORK] [ nvarchar ](< span class =code-digit> 250 ) NOT NULL
[TARIFF_NAME] [ nvarchar ]( 250 NULL
[CONTRACT_LENGTH] [ nvarchar ]( 50 NOT NULL
[MINUTES] [ nvarchar ]( 50 NOT NULL
[TEXTS] [ nvarchar ]( 50 NOT NULL
[DATA] [ nvarchar ]( 50 NOT NULL
[GIFTS] [ nvarchar ]( 250 NULL

GO


- PROC:
CREATE PROCEDURE [dbo]。[SP_SET_PRODUCT_EXCELDATA]
@ TblExcelData TYPE_INSERT_EXCELDATA READONLY,
@ OUTPUT NVARCHAR (MAX) OUTPUT
AS
BEGIN
SET NOCOUNT ON ;

BEGIN TRY
INSERT INTO GLB_M_EXCELDATA(MERCHANT,DEAL_ID,MODEL_NAME,PRODUCT_URL,LINE_RENTAL,IMAGE_URL,CATEGORY_NAME,BRAND,PRICE,NETWORK,CONTRACT_LENGTH,TARIFF_NAME,MINUTES,TEXTS,DATA,GIFTS)

SELECT MERCHANT,DEAL_ID,MODEL_NAME,PRODUCT_URL,LINE_RENTAL,IMAGE_URL,CATEGORY_NAME,品牌,价格,网络,CONTRACT_LENGTH,TARIFF_NAME,MINUTES,TEXTS,DATA,GIFTS FROM @ TblExcelData
END TRY
BEGIN CATCH
INSERT INTO TBL_LOG(ERRORMESSAGE,PROCEDURENAME,CREATEDDATE,ERRORNUMBER) VALUES (ERROR_MESSAGE(),ERROR_PROCEDURE(),GETDATE(),ERROR_NUMBER());
SET @ OUTPUT = ' FAILURE'< /跨度>;
END CATCH

END

解决方案

如果只想插入一个表,那么可以使用 SqlBulkCopy 。请点击以下链接:



传输数据使用SqlBulkCopy [ ^ ]



SqlBulkCopy:使用C#和VB.Net将数据从DataTable(DataSet)批量复制到SQL Server表 [ ^ ]



其次很明显,如果您要处理50,000条记录,则需要这样做。在这种情况下,您可以创建后台服务(Windows服务或SQL作业),它将运行并将您的数据插入SqlServer。这样它不会影响你的主UI线程。


Hi,
I have around 50000 records in my DataTable,i tried to use user defined table type as a parameter in my stored procedure.anyway its taking too much time for insertion and my application got hanged.

Can anybody suggest me ,how do i approach this?

What I have tried:

--User defined table type:
CREATE TYPE [dbo].[TYPE_INSERT_EXCELDATA] AS TABLE(
	[MERCHANT] [nvarchar](50) NOT NULL,
	[DEAL_ID] [nvarchar](50) NOT NULL,
	[MODEL_NAME] [nvarchar](100) NOT NULL,
	[PRODUCT_URL] [nvarchar](max) NOT NULL,
	[LINE_RENTAL] [nvarchar](50) NOT NULL,
	[IMAGE_URL] [nvarchar](max) NOT NULL,
	[CATEGORY_NAME] [nvarchar](50) NOT NULL,
	[BRAND] [nvarchar](50) NOT NULL,
	[PRICE] [float] NOT NULL,
	[NETWORK] [nvarchar](250) NOT NULL,
	[TARIFF_NAME] [nvarchar](250) NOT NULL,
	[CONTRACT_LENGTH] [nvarchar](50) NOT NULL,
	[MINUTES] [nvarchar](50) NOT NULL,
	[TEXTS] [nvarchar](50) NOT NULL,
	[DATA] [nvarchar](50) NOT NULL,
	[GIFTS] [nvarchar](250) NULL
)
GO


--PROC:
CREATE PROCEDURE [dbo].[SP_SET_PRODUCT_EXCELDATA]
      @TblExcelData TYPE_INSERT_EXCELDATA READONLY,
	  @OUTPUT NVARCHAR(MAX) OUTPUT
AS
BEGIN
      SET NOCOUNT ON;
     
	 BEGIN TRY
      INSERT INTO GLB_M_EXCELDATA(MERCHANT, DEAL_ID, MODEL_NAME,PRODUCT_URL,LINE_RENTAL,IMAGE_URL,CATEGORY_NAME,BRAND,PRICE,NETWORK,CONTRACT_LENGTH,TARIFF_NAME,MINUTES,TEXTS,DATA,GIFTS)

      SELECT MERCHANT, DEAL_ID, MODEL_NAME,PRODUCT_URL,LINE_RENTAL,IMAGE_URL,CATEGORY_NAME,BRAND,PRICE,NETWORK,CONTRACT_LENGTH,TARIFF_NAME,MINUTES,TEXTS,DATA,GIFTS FROM @TblExcelData
	  END TRY
	  BEGIN CATCH
	  INSERT INTO TBL_LOG(ERRORMESSAGE,PROCEDURENAME,CREATEDDATE,ERRORNUMBER) VALUES(ERROR_MESSAGE(),ERROR_PROCEDURE(),GETDATE(),ERROR_NUMBER());
      SET @OUTPUT='FAILURE';
	  END CATCH

END

解决方案

If you want to insert record only one table then you can use SqlBulkCopy. Follow below links:

Transferring Data Using SqlBulkCopy[^]

SqlBulkCopy: Bulk Copy data from DataTable (DataSet) to SQL Server Table using C# and VB.Net[^]

Secondly it is obvious that it will take if you will process 50,000 records. In this scenario, you can create background service(windows service or sql job) which will run and insert your data to SqlServer. So that it won't affect your main UI thread.


这篇关于我可以使用用户定义的表类型来插入大数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆