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 行受影响)*/
<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 行受影响)*/
declare @xml xmlset @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>'select @xml.exist('/root/Test[ID="1"]') 'exist'/*
exist
-----
1(1 row(s) affected)
*/
select @xml.exist('/root/Test[1]')这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')但是不能写成这样:select @xml.exist('/root/Test['+@num+']')我是想用一个变量做循环,可以吗?
select @xml.exist('/root/Test[1]')这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')但是不能写成这样:select @xml.exist('/root/Test['+@num+']')我是想用一个变量做循环,可以吗?这样貌似不行的,这个不支持变量,XML 数据类型方法 "exist" 的参数 1 必须是字符串文字
还不够灵活
select @xml.exist('/root/Test[1]')这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')但是不能写成这样:select @xml.exist('/root/Test['+@num+']')我是想用一个变量做循环,可以吗?这样貌似不行的,这个不支持变量,XML 数据类型方法 "exist" 的参数 1 必须是字符串文字
还不够灵活
好吧。
那我向你请教一个问题吧数据库有一张表,Customer,要做批量插入,应该怎么弄呢?我的想要其中有一笔资料插入失败,则全部回滚。
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 onbegin 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