SQL读取XML文件数据相关

了缘 2005-11-24 10:21:27
1,如何可以把XML文件中的数据直接读入SQL中?
EXEC master..xp_cmdshell 'bcp udrp_app2..testaaa in c:\aa.xml -c -q -S"servername" -U"username" -P"password" '
用这个方式是可以把XML的文件数据加入到表中,但是这样加入到表中的数据是以表格形式一行一行的,并不是一个TEXT供SQL来读取,所以我现在需要如何才能把XML的数据以一个字符串的形式在SQL里出现,用SQL语句是否可以实现?
2,SQL对XML的数据是否有类型的选择,如:
Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
这样的XML数据,SQL可以读出
但是下面:
<?xml version="1.0" encoding="gb2312"?>
<ufinterface roottag="code" billtype="" docid="" receiver="u8" sender="008">
<code id="">
<id>40</id>
<type>资产</type>
<type_ename>ZC</type_ename>
<analysis_type></analysis_type>
<analysis_type_ename/>
</code>
</ufinterface>
这种格式的XML数据就读不出来了,不知道什么原因?
我是用
SELECT *
-- INTO TABLENAME 你要存放数据的表名
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))
这个来读取的
欢迎来指教
...全文
824 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
点点星灯 2005-11-25
  • 打赏
  • 举报
回复
这样保存到数据库中的就不是字符串,是一个文件,你可以再读出来还原为一个文件。
了缘 2005-11-25
  • 打赏
  • 举报
回复
to aw511(点点星灯) ( )
--参考
那就不用上面的方式,改为将你的aa.xml文件转化为二进制流文件,保存在数据库的image 字段中,

这样取值是否会有问题,就是取到的值不再是字符串了?
superhasty 2005-11-25
  • 打赏
  • 举报
回复
哦。我也正在做这个测试。
了缘 2005-11-25
  • 打赏
  • 举报
回复
-- 由于导入临时表中的数据是表格形式的,下面把该数据转换成XML类型的字符串
SELECT @varXmlData=ISNULL(@varXmlData,'') + ISNULL(data,'') FROM tabXML
就是这里了,如果XML数据太大,就会出错
了缘 2005-11-25
  • 打赏
  • 举报
回复
TO : aw511(点点星灯) ( )
您好象对我的第一个问题有所误解
我并不是要把数据存入到数据库中,而是需要把XML文件中的数据读取出来,并通过SQL把里面的对应的字段值导出到一个表中.
我前面的方法可以把数据写入到SQL中,但是如果XML数据太大,超过8000个字符的话,XML的数据会被截断,而好象SQL局部变量里只能设置最大值为8000的VARCHAR类型,而不可以设置NTEXT或TEXT类型,请参照如下存储过程:
CREATE PROC dbo.procGetXmlData(@varPath varchar(50))
/*
功能说明:读取XML文件的数据,导入SQL数据表中
时间:2005-11-22
开发人:吴涛
对XML数据需求说明,如下格式:
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>
SQL是可以解析到的,但是对下面这种格式:
<?xml version="1.0" encoding="gb2312"?>
<ufinterface roottag="code" billtype="" docid="" receiver="u8" sender="008">
<code id="">
<id>40</id>
<type>资产</type>
<type_ename>ZC</type_ename>
<analysis_type></analysis_type>
<analysis_type_ename/>
</code>
</ufinterface>
SQL就解析不到,不知道是否是SQL对这个XML版本数据不支持的缘故,欢迎讨论
MSN:wutao82@hotmail.com
*/
AS

SET NOCOUNT ON

-- DECLARE @varPath VARCHAR(50)
-- SET @varPath='C:\bb.xml'

DECLARE @varXmlData varchar(8000)
CREATE TABLE tabXML (data varchar(1000))

-- 读取XML文件,并把数据导入临时表(用临时表好象下面的存储过程不可以用,所以改为实表,不过后面还是可以删除掉的)
DECLARE @SQL NVARCHAR(4000)
SET @SQL='EXEC master..xp_cmdshell ''BCP udrp_app2.dbo.tabXML IN ' + @varPath + ' -c -q -S"ufsoft3\sql1" -U"sa" -P"wecoo" '''
--EXEC SP_EXECUTESQL @SQL
EXECUTE(@SQL)
--EXEC master..xp_cmdshell 'bcp udrp_app2.dbo.tabXML in '+ @varPath + ' -c -q -S"ufsoft3\sql1" -U"sa" -P"wecoo" '
--EXEC master..xp_cmdshell 'bcp udrp_app2..testaaa in c:\aa.xml -c -q -S"servername" -U"username" -P"password" '

-- 由于导入临时表中的数据是表格形式的,下面把该数据转换成XML类型的字符串
SELECT @varXmlData=ISNULL(@varXmlData,'') + ISNULL(data,'') FROM tabXML

-- 下面开始解析XML数据
DECLARE @idoc int

-- 创建XML环境
EXEC sp_xml_preparedocument @idoc OUTPUT, @varXmlData

SELECT *
-- INTO TABLENAME 你要存放数据的表名
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))

DROP TABLE tabXML

GO

-- (所影响的行数为 2 行)
-- CustomerID ContactName
-- VINET Paul Henriot
-- LILAS Carlos Gonzlez


了缘 2005-11-25
  • 打赏
  • 举报
回复
改为将你的aa.xml文件转化为二进制流文件
是否有函数可以用?
了缘 2005-11-25
  • 打赏
  • 举报
回复
create table tabXML( aa image)

EXEC master..xp_cmdshell 'bcp udrp_app2.dbo.tabXML in c:\aa.xml -c -q -S"ufsoft3\sql1" -U"sa" -P"wecoo" '

结果:
NULL
开始复制...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]文本列数据未完成
NULL
BCP 复制 in 失败
NULL

好象不可以对IMAGE类型的数据进行插入
了缘 2005-11-25
  • 打赏
  • 举报
回复
TO : aw511(点点星灯) ( )
试试看,还没有使用过IMAGE类型的数据,我的MSN:wutao82@hotmail.com,交个朋友吧?
了缘 2005-11-24
  • 打赏
  • 举报
回复
还有第一个问题,
飞狼兄 2005-11-24
  • 打赏
  • 举报
回复
学习
点点星灯 2005-11-24
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="gb2312"?>
<ufinterface roottag="code" billtype="" docid="" receiver="u8" sender="008">
<code id="">
<id>40</id>
<type>资产</type>
<type_ename>ZC</type_ename>
<analysis_type></analysis_type>
<analysis_type_ename/>
</code>
</ufinterface>

上面的内容不符合标准的XML的格式,所以SQL识别不了,读不出来。
点点星灯 2005-11-24
  • 打赏
  • 举报
回复
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))



declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')

结果如下:

OrderID CustomerID OrderDate ProdID Qty

------------------------------------------------------------------------

10248 VINET 1996-07-04 00:00:00.000 11 12
10248 VINET 1996-07-04 00:00:00.000 42 10
10283 LILAS 1996-08-16 00:00:00.000 72 3

wt_yao 2005-11-24
  • 打赏
  • 举报
回复
我也有同样的问题
点点星灯 2005-11-24
  • 打赏
  • 举报
回复
1,如何可以把XML文件中的数据直接读入SQL中?
EXEC master..xp_cmdshell 'bcp udrp_app2..testaaa in c:\aa.xml -c -q -S"servername" -U"username" -P"password" '
用这个方式是可以把XML的文件数据加入到表中,但是这样加入到表中的数据是以表格形式一行一行的,并不是一个TEXT供SQL来读取,所以我现在需要如何才能把XML的数据以一个字符串的形式在SQL里出现,用SQL语句是否可以实现?


--参考
那就不用上面的方式,改为将你的aa.xml文件转化为二进制流文件,保存在数据库的image 字段中,

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧