2015-04-24 2 views
-1

Из моего C# я создаю datatable во время выполнения. Я хочу передать эту информацию в хранимую процедуру, чтобы данные вставлялись вместе в таблицу. Я использую MySQL как базу данных. Что такое эквивалент MySQL для передачи xml для множественной вставки в SQL-Server?Массовая вставка в MySQL с хранимой процедурой

сгенерировать XML из набора данных и передал его в хранимой процедуре:

CREATE DEFINER=`root`@`localhost` PROCEDURE `RouteLocationVehicleTimeInsert`(

    IN xml VARCHAR(1000000) 
    ) 
BEGIN 
    SET @x=1; 
    SET @val=xml; 
    WHILE @x<=4 DO 
     SET @vehicleId=EXTRACTVALUE(@val, 'NewDataSet/Table1/vehicle_id[[email protected]]'); 
     SET @routeId = EXTRACTVALUE(@val, 'NewDataSet/Table1/route_id[[email protected]]'); 
     SET @locationId = EXTRACTVALUE(@val, 'NewDataSet/Table1/location_id[[email protected]]'); 
     SET @arrivalTime = EXTRACTVALUE(@val, 'NewDataSet/Table1/arrival_time[[email protected]]'); 
    INSERT INTO `rm.routelocation_fm.vehicle_time`(`vehicle_id`,`route_id`,`location_id`,`arrival_time`) 
    VALUES(@vehicleId,@routeId,@locationId,@arrivalTime); 
    SET @[email protected]+1; 
    END WHILE; 
[email protected]@ 

Но это не помогает. Когда я проверить SQL заявление написано в СП я дает Умножить значения в одном столбце, вроде как ниже

SET @val='<NewDataSet> 
<Table1> 
<vehicle_id>1</vehicle_id> 
<route_id>5</route_id> 
<location_id>1</location_id> 
<arrival_time>00:00</arrival_time> 
</Table1> 
<Table1> 
    <vehicle_id>2</vehicle_id> 
    <route_id>5</route_id> 
    <location_id>2</location_id> 
    <arrival_time>00:00</arrival_time> 
    </Table1></NewDataSet>'; 
SET @x=1; 

     SET @vehicle_id= EXTRACTVALUE(@val, 'NewDataSet/Table1/vehicle_id[1]'); 
     SELECT @vehicle_id; 

это дает результат как 1 1 в той же колонке. где они две записи.

+0

Да, мне удалось передать данные в формате XML, как показано ниже, SET @ вал =» 1 00:00 2 00:00 '; SET @ x = 1; SET @locationId = EXTRACTVALUE (@val, 'NewDataSet/Table1/location_id [$ @ x]'); SELECT @locationId; – Sangeetha

+0

Но когда я проверяю это, используя результат выражения select, получается как «1 2» instaer 1 – Sangeetha

+0

вы можете добавить это к своему оригинальному сообщению ... – BK435

ответ

0

В нижнем примере у вас есть <Table1></Table1> блок дважды. И в соответствии с определения в XML Functions документации:

Если несколько матчей найдены, содержание первого текста ребенка узла каждого согласующего элемента возвращается (в порядке согласованного) в качестве единого пространства, разделенной строки ,

Он возвращает содержимое первых vehicle_id как в <Table1> блоках. Если вы хотите, чтобы идентификатор только с первого <Table1>, измените свой XPath на 'NewDataSet/Table1[1]/vehicle_id[1]'.

+0

Спасибо! Это спасло мне жизнь. – Sangeetha

0

Ваш начальный xpath: NewDataSet/Table1/vehicle_id[1] на самом деле не помогает, потому что он сначала возвращает vehicle_id от каждого Table1 родителей. Поскольку в каждом Table1 есть только один vehicle_id, xpath не производит никакого эффекта.

Обычно, чтобы получить только первый матч из нас завернуть XPath весь в XPath ()[1], что-то вроде этого:

(NewDataSet/Table1/vehicle_id)[1] 

К сожалению, выше синтаксис XPath не кажется, поддерживается в MySQL EXTRACTVALUE(). Вы должны прибегнуть к чему-то более сложному, чтобы получить подобный результат:

NewDataSet/Table1[vehicle_id][1]/vehicle_id[1] 

Выше XPath получить первыеvehicle_id из первогоTable1 имея ребенок vehicle_id.

SQL Fiddle

Смежные вопросы