Sql server 我可以使用用户定义的表类型插入大数据吗?
我的DataTable中有大约50000条记录,我试图在存储过程中使用用户定义的表类型作为参数。无论如何,插入花费了太多时间,我的应用程序被挂起 谁能告诉我,我该怎么做? 我试过什么Sql server 我可以使用用户定义的表类型插入大数据吗?,sql-server,Sql Server,我的DataTable中有大约50000条记录,我试图在存储过程中使用用户定义的表类型作为参数。无论如何,插入花费了太多时间,我的应用程序被挂起 谁能告诉我,我该怎么做? 我试过什么 User defined table type: CREATE TYPE [dbo].[TYPE_INSERT_EXCELDATA] AS TABLE( [MERCHANT] [nvarchar](50) NOT NULL, [DEAL_ID] [nvarchar](50) NOT NULL,
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
插入时间在很大程度上取决于GLB_M_EXCELDATA表上有多少索引。插入前停用它们,插入后激活。@dimason先生,我没有此表的任何索引。旁注:您不应该在存储过程中使用
sp\uu
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp.
并使用其他东西作为前缀,或者根本不使用前缀@谢谢你,我下次一定会跟上来的@King_Fisher,一个TVP不应该占用5万排的大量时间。我看过TVP insert和SqlBulkCopy的insert性能。插入是否被并发活动阻止?一个重要的细节是指定DataTable中字符串列的实际最大长度。