Как вставить объемные данные без изменения порядка элементов в таблице с помощью оператора слияния - PullRequest
0 голосов
/ 24 декабря 2018

Я написал хранимую процедуру, которая может вставлять объемные данные в таблицу с помощью оператора merge.

Проблема заключается в том, что когда я вставляю itemid 1024,1000,1012,1025 в этом порядке, то SQL Server автоматическипорядок изменения itemid 1000, 1012, 1024, 1025.

Я хочу вставить данные, которые я на самом деле передаю.

Вот пример кода.При этом XML-строка будет проанализирована в табличном объекте:

DECLARE @tblPurchase TABLE
            (
              Purchase_Detail_ID INT ,
              Purchase_ID INT ,
              Head_ID INT ,
              Item_ID INT 
            );


INSERT INTO @tblPurchase (Purchase_Detail_ID, Purchase_ID, Head_ID, Item_ID)
    SELECT  
        Tbl.Col.value('Purchase_Detail_ID[1]', 'INT') AS Purchase_Detail_ID,
        Tbl.Col.value('Purchase_ID[1]', 'INT') AS Purchase_ID,
        Tbl.Col.value('Head_ID[1]', 'INT') AS Head_ID,
        Tbl.Col.value('Item_ID[1]', 'INT') AS Item_ID 
    FROM    
        @PurchaseDetailsXML.nodes('/documentelement/TRN_Purchase_Details') Tbl(Col) 

Это позволит вставить объемные данные в таблицу TRN_Purchase_Details:

MERGE TRN_Purchase_Details MTD
USING (SELECT    
           Purchase_Detail_ID,
           Id AS Purchase_ID,
           Head_ID, Item_ID 
       FROM      
           @tblPurchase
       LEFT JOIN 
           @ChangeResult ON 1 = 1) AS TMTD ON MTD.Purchase_Detail_ID = TMTD.Purchase_Detail_ID
                                           AND MTD.Purchase_ID = TMTD.Purchase_ID

WHEN MATCHED THEN
    UPDATE SET MTD.Head_ID = TMTD.Head_ID,
               MTD.Item_ID = TMTD.Item_ID 

WHEN NOT MATCHED BY TARGET THEN
    INSERT (Purchase_ID, Head_ID, Item_ID)
    VALUES (Purchase_ID, Head_ID, Item_ID)

WHEN NOT MATCHED BY SOURCE AND       
     MTD.Purchase_ID = (SELECT TOP 1 Id
                        FROM @ChangeResult
                        WHERE Id > 0) THEN
    DELETE;   

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Как уже упоминалось, данные в таблице хранятся как неупорядоченный набор.Если вам нужно иметь возможность вернуться к своей таблице после вставки данных и определить порядок их добавления, вам потребуется добавить столбец в схему таблицы для записи этой информации.

Это может быть что-то простое, например, добавление столбца IDENTITY, который будет увеличиваться при каждом добавлении строки, или, возможно, столбец с типом данных DATETIME и значением по умолчанию GETDATE(), так что вы не толькознаю, что строки заказа были добавлены, но когда это произошло.

0 голосов
/ 24 декабря 2018

Строки в таблице SQL не имеют порядка.Они возвращаются в неопределенном порядке, если вы не укажете order by.

Попробуйте добавить столбец идентификаторов во временную таблицу?

DECLARE @tblPurchase TABLE
        (
          ID int identity,
          Purchase_Detail_ID INT ,

Столбец идентификаторов может захватывать порядок элементов XML.

Если это не сработает, вы можете рассчитать положение элементов в XML и сохранить эту позицию во временной таблице.

...