在SQL Server中将varchar值转换为数据类型int时转换失败

时间:2014-06-02 17:00:27

标签: sql sql-server xml

我有问题。我有2个相同的代码,用于将数据从XML插入到SQL Server中的表中。

我的第一个代码:

declare
   @nDoc int,
   @cXML xml

select @cXML = '<root><rekening NomorCIF=''123'' NomorRek=''123456789'' StatusRek=''1'' MataUang=''IDR'' Saldo=''1000''></rekening></root>'

exec sp_xml_preparedocument @nDoc output, @cXML

insert into [50732Rekening_TM] select * from OPENXML (@nDoc, 'root/rekening', 1) with  (NomorCIF varchar(30), NomorRek varchar(30), StatusRek varchar(30), MataUang varchar(30), Saldo varchar(30))

exec sp_xml_removedocument @nDoc

此代码运行顺利

但是这段代码会返回错误

declare
    @nDoc int,
    @cXML xml,
    @query nvarchar(max)

select @cXML ='<root><rekening NomorCIF=''123'' NomorRek=''123456789'' StatusRek=''1'' MataUang=''IDR'' Saldo=''1000''></rekening></root>'

exec sp_xml_preparedocument @nDoc output, @cXML

set @query = 'insert into [50732Rekening_TM] select * from OPENXML ('+@nDoc+', ''root/rekening'', 1) with (NomorCIF varchar(30), NomorRek varchar(30), StatusRek varchar(30), MataUang varchar(30), Saldo varchar(30))'

exec sp_executesql @query
exec sp_xml_removedocument @nDoc

错误是

  

Msg 245,Level 16,State 1,Line 15
  将varchar值'insert into [50732Rekening_TM] select *从OPENXML('转换为数据类型int。

转换失败

为什么第二个代码包含错误?我需要它,但我不知道如何解决它。

由于

2 个答案:

答案 0 :(得分:1)

您必须将XML文档的句柄作为参数

传递
declare
    @nDoc int,
    @cXML xml,
    @query nvarchar(max)

select @cXML ='<root><rekening NomorCIF=''123'' NomorRek=''123456789'' StatusRek=''1'' MataUang=''IDR'' Saldo=''1000''></rekening></root>'

exec sp_xml_preparedocument @nDoc output, @cXML

set @query = N'insert into [50732Rekening_TM] select * from OPENXML (@nDoc, ''root/rekening'', 1) with (NomorCIF varchar(30), NomorRek varchar(30), StatusRek varchar(30), MataUang varchar(30), Saldo varchar(30))'
exec sp_executesql @query, N'@nDoc int', @nDoc = @nDoc
exec sp_xml_removedocument @nDoc

答案 1 :(得分:0)

您必须将@nDoc int参数转换为字符串,因为您无法将int值与字符串@query变量连接。

declare
    @nDoc int,
    @cXML xml,
    @query nvarchar(max)

select @cXML ='<root><rekening NomorCIF=''123'' NomorRek=''123456789'' StatusRek=''1'' MataUang=''IDR'' Saldo=''1000''></rekening></root>'

exec sp_xml_preparedocument @nDoc output, @cXML

set @query = 'insert into [50732Rekening_TM] select * from OPENXML ('+convert(varchar,@nDoc)+', ''root/rekening'', 1) with (NomorCIF varchar(30), NomorRek varchar(30), StatusRek varchar(30), MataUang varchar(30), Saldo varchar(30))'
exec sp_executesql @query
exec sp_xml_removedocument @nDoc