解决方案 »

  1.   

    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 行受影响)*/
      

  2.   


    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)
    */
      

  3.   


    select @xml.exist('/root/Test[1]')这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')但是不能写成这样:select @xml.exist('/root/Test['+@num+']')我是想用一个变量做循环,可以吗?
      

  4.   


    select @xml.exist('/root/Test[1]')这样写可以判断该xml中包含第一个Test表,要判断第二张表:select @xml.exist('/root/Test[2]')但是不能写成这样:select @xml.exist('/root/Test['+@num+']')我是想用一个变量做循环,可以吗?这样貌似不行的,这个不支持变量,XML 数据类型方法 "exist" 的参数 1 必须是字符串文字
    还不够灵活
      

  5.   


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

  6.   


    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