2017-12-08 1 views
0

지난 24 시간 동안 솔루션을 찾기 위해 인터넷을 썼지 만 아직 찾지 못했습니다. 대량 업서 트 (업데이트 또는 삽입) 단일 모델의 mssql 데이터베이스에 할 노력하고 있어요. updateOnDuplicate로 bulkCreate : true는 mssql에서 작동하지 않습니다. 다른 해결책이 있습니까? 이것은 데이터 집합으로 1 ~ 50k 행 사이에 있습니다. 어떤 도움이라도 대단히 감사하겠습니다!Sequelize : 대량 업데이트 또는 MSSQL DB에 삽입

답변

0

SQL 2016+의 경우 NVarchar (max) 매개 변수를 사용하여 대량 데이터를 JSON으로 전달하고 서버에서 구문 분석하고로드 할 수 있습니다. 귀하의 질의는 다음과 같이 보일 것이다 :

Insert into TargetTable(Number,Date,Customer,Quantity,[Order]) 
SELECT Number,Date,Customer,Quantity,[Order] 
FROM OPENJSON (@json) 
WITH ( 
       Number varchar(200) '$.Order.Number', 
       Date  datetime  '$.Order.Date', 
       Customer varchar(200) '$.AccountNumber', 
       Quantity int   '$.Item.Quantity', 
       [Order] nvarchar(MAX) AS JSON 
); 

을 그리고 당신은 NVARCHAR (최대) (문자열)과 같은 값으로 @json 매개 변수 바인딩 것 : 업데이트를 같은 것을 보일 것이다

[ 
    { 
    "Order": { 
     "Number":"SO43659", 
     "Date":"2011-05-31T00:00:00" 
    }, 
    "AccountNumber":"AW29825", 
    "Item": { 
     "Price":2024.9940, 
     "Quantity":1 
    } 
    }, 
    { 
    "Order": { 
     "Number":"SO43661", 
     "Date":"2011-06-01T00:00:00" 
    }, 
    "AccountNumber":"AW73565", 
    "Item": { 
     "Price":2024.9940, 
     "Quantity":3 
    } 
    } 
] 

:

with q as 
(
    select t.Number, t.Quantity oldQuantity, j.Quantity newQuantity 
    from OPENJSON (@json) 
    WITH ( 
        Number varchar(200) '$.Order.Number', 
        Date  datetime  '$.Order.Date', 
        Customer varchar(200) '$.AccountNumber', 
        Quantity int   '$.Item.Quantity', 
        [Order] nvarchar(MAX) AS JSON 
     ) j 
    join TargetTable t 
     on j.Number = t.Number 
) 
update q set oldQuantity = newQuantity 

참조 :

당신이 매개 변수를 바인딩 할 수없는 경우 https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql, 그런 다음 JSON 문서를 TSQL 배치에 리터럴 문자열로 포함 시키십시오.

+0

나는 그 반응에 대해 감사하게 생각합니다. 실제로 그것에 대해 흥미로운 방법입니다. 일반적으로 TVP와 MERGE 저장 프로 시저를 사용합니다. http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/ 여기에 설명 된 내용과 유사합니다. 그러나 질문은 SQL에서 그렇게하는 방법에 관한 것이 아니라 Sequelize를 사용하여 그렇게하는 방법에 관한 것이 었습니다. 나는 SQL로 그것을하는 방법을 안다.하지만 Sequelize는이 기능을 가져야한다. – tacotuesday

+0

오른쪽. JSON을 전달하는 것은 TVP와 성능이 비슷해야하지만 클라이언트 드라이버에서 특별한 API를 지원하지 않아도됩니다. –

+0

업데이트 또는 삽입 기능은 어떻게 작동합니까? – tacotuesday

관련 문제