日期:2014-05-16  浏览次数:20481 次

在sql server中使用xml的问题
declare @xml xml

set @xml=N'<root>
<Test>
<ID>0</ID>
<Name>張三</Name>
</Test>
<Test>
<ID>1</ID>
<Name>李四</Name>
</Test>
<Test>
<ID>2</ID>
<Name>王五</Name>
</Test>
   </root>'


declare @num int

set @num=1
 
select @xml.exist('/root/Test['+@num+']')



这个不行啊,要实现这样的效果怎么弄?


------解决方案--------------------
declare @xml XML,@idoc INT

 set @xml=N'<root>
 <Test>
 <ID>0</ID>
 <Name>張三</Name>
 </Test>
 <Test>
 <ID>1</ID>
 <Name>李四</Name>
 </Test>
 <Test>
 <ID>2</ID>
 <Name>王五</Name>
 </Test>
    </root>'
    
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml  

BEGIN TRY
BEGIN TRAN

--SELECT @xml.value('(root/Test/ID/text())[1]','TINYINT')

SELECT 
  *
FROM  OPENXML(@idoc,'root/Test/ID',3)
WITH 
([ID] TINYINT '.[1]')
 
COMMIT TRAN
EXEC sp_xml_removedocument @idoc
END TRY
BEGIN CATCH
DECLARE @ERROR VARCHAR(MAX)
SELECT  @Error=ERROR_MESSAGE()
RAISERROR 50001 @Error
ROLLBACK TRAN
END CATCH

/*ID
----
0
1
2

(3 行受影响)*/

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

不知道是不是这个意思?


select @xml.exist('/root/Test[1]')

这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')

但是不能写成这样:select @xml.exist('/root/Test['+@num+']')

我是想用一个变量做循环,可以吗?



这样貌似不行的,这个不支持变量,XML 数据类型方法 "exist" 的参数 1 必须是字符串文字
还不够灵活


好吧。
那我向你请教一个问题吧

数据库有一张表,Customer,要做批量插入,应该怎么弄呢?

我的想要其中有一笔资料插入失败,则全部回滚。


试试这个:
create table ttt(id int primary key ,v varchar(10))
go


--只要报错,就回滚
set xact_abort on

begin tran
insert into ttt
values(1,'a')

insert into ttt
values(2,'xxxxxxxxxxxxxxxx')

insert into ttt
values(3,'c')
commit 
/*
(1 行受影响)
消息 8152,级别 16,状态 14,第 5 行
将截断字符串或二进制数据。
*/


--由于上面报错,所以一条都没有插入
select * from ttt