2015-04-24 34 views
-1

从我的C#中,我在运行时创建数据表。我想将这个数据表传递给存储过程,以便数据将一起插入到表中。 我使用MySQL作为数据库。在SQL-Server中,多个插入的MySQL通过xml等效的是什么?使用存储过程在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]@ 

但它并不能帮助。当我测试写入SP的SQL语句I给出了含多处值在同一列中,像如下

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 @ VAL =” 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文档:

如果找到多个匹配,则第一子文本返回各匹配元件的 节点的内容(在匹配顺序),为 单,空间分隔的字符串。

它返回<Table1>块中第一个vehicle_id的内容。如果您想从第一个<Table1>开始,请将您的XPath更改为'NewDataSet/Table1[1]/vehicle_id[1]'

+0

谢谢!它拯救了我的生命。 – Sangeetha

0

您的初始xpath:NewDataSet/Table1/vehicle_id[1]并不真的有帮助,因为它会从每个Table1父项中返回第一个vehicle_id。由于每个Table1中只有一个vehicle_id,因此xpath不会产生任何影响。

通常,为了从一个XPath只有第一场比赛,我们内()[1]包住整个XPath的,是这样的:

(NewDataSet/Table1/vehicle_id)[1] 

不幸的是,上面的XPath语法似乎并不通过MySQL的EXTRACTVALUE()支持。你需要求助于更复杂的东西拿到类似结果:

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

以上的XPath获得从第一Table1第一vehicle_id有孩子vehicle_id

SQL Fiddle