Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中将varchar值转换为int数据类型时,转换失败_Sql_Sql Server_Xml - Fatal编程技术网

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

在SQL Server中将varchar值转换为int数据类型时,转换失败,sql,sql-server,xml,Sql,Sql Server,Xml,我有个问题。关于在SQLServer中将数据从XML插入表,我有两个相同的代码 我的第一个代码: declare @nDoc int, @cXML xml select @cXML = '<root><rekening NomorCIF=''123'' NomorRek=''123456789'' StatusRek=''1'' MataUang=''IDR'' Saldo=''1000''></rekening></root>'

我有个问题。关于在SQLServer中将数据从XML插入表,我有两个相同的代码

我的第一个代码:

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
声明
@nDoc int,
@cXML
选择@cXML=''
exec sp_xml_preparedocument@nDoc output@cXML
插入到[50732reking_TM]中,从OPENXML(@nDoc,'root/rekening',1)中选择*并使用(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
声明
@nDoc int,
@cXML,
@查询nvarchar(最大值)
选择@cXML=''
exec sp_xml_preparedocument@nDoc output@cXML
set@query='插入[50732reking_TM]从OPENXML('+@nDoc+','root/rekening',1)中选择*,使用(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,16级,状态1,第15行
将varchar值“insert”从OPENXML(”转换为[50732reking_TM]select*到数据类型int时,转换失败

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


谢谢

您必须将@nDoc int参数转换为string,因为您不能将int值与string@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
声明
@nDoc int,
@cXML,
@查询nvarchar(最大值)
选择@cXML=''
exec sp_xml_preparedocument@nDoc output@cXML
设置@query='插入[50732reking_TM]从OPENXML中选择*('+convert(varchar,@nDoc)+','root/rekening',1)和(NomorCIF varchar(30),NomorRek varchar(30),StatusRek varchar(30),MataUang varchar(30),Saldo varchar(30))'
exec sp_executesql@query
exec sp_xml_removedocument@nDoc

必须将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
声明
@nDoc int,
@cXML,
@查询nvarchar(最大值)
选择@cXML=''
exec sp_xml_preparedocument@nDoc output@cXML
设置@query=N'insert到[50732reking_TM]中,从OPENXML(@nDoc,“root/rekening”,1)中选择*,使用(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

嗯,
@nDoc
是一个
INT
,所以你不能在不转换它的情况下用字符串连接它。或者将
@nDoc
作为参数添加到动态代码中只要将它改为
从OPENXML('+cast(@nDoc as varchar)+'