我有问题。我有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。
为什么第二个代码包含错误?我需要它,但我不知道如何解决它。
由于
答案 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