Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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 SQL Server“;字符串或二进制数据将被截断;XML插入_Sql Server_Xml - Fatal编程技术网

Sql server SQL Server“;字符串或二进制数据将被截断;XML插入

Sql server SQL Server“;字符串或二进制数据将被截断;XML插入,sql-server,xml,Sql Server,Xml,我对SQL Server比较陌生。我的大部分背景是MS Access。我有一个存储过程,它接受一个XML文件并将节点信息插入16个不同的表中。我得到一个“字符串或二进制数据将被截断”错误。以下是导致问题的代码片段: DECLARE @xml XML DECLARE @filename varchar(255); Select @filename = 'SilvxInSightImport_uslsss17_14-08-24_20-40-00.xml' --Select @filename =

我对SQL Server比较陌生。我的大部分背景是MS Access。我有一个存储过程,它接受一个XML文件并将节点信息插入16个不同的表中。我得到一个“字符串或二进制数据将被截断”错误。以下是导致问题的代码片段:

DECLARE @xml XML
DECLARE @filename varchar(255);

Select @filename = 'SilvxInSightImport_uslsss17_14-08-24_20-40-00.xml'
--Select @filename = @filepath

Select @xml = 
CONVERT(XML,bulkcolumn,2) FROM OPENROWSET(BULK 'C:\Users\Kevin.Smith\Documents\TDAT\CPOFiles\SilvxInSightImport_uslsss17_14-08-31_20-40-01.xml',SINGLE_BLOB) AS X


Insert into [SILVX_CIRCUIT]
(
FileName, md_group,pkey,s_state,circuit_name,admin,protection,vpnid,sourcereroute,trunkrestoration,fwdbw,
sourcetype,sourceip,sourcechassis,sourceslot,sourceport,sourcechannel,destinationtype,
destinationip,destinationchassis,destinationslot,destinationport,destinationchannel,circuitpath,
reversion,cg_net_instance,parent_hpkey
)

select @filename,
       T.X.value('(MD_GROUP/text())[1]', 'nvarchar(255)') as MD_GROUP,
       T.X.value('(PKEY/text())[1]', 'nvarchar(255)') as PKEY,
       T.X.value('(S_STATE/text())[1]', 'nvarchar(255)') as S_STATE,
       T.X.value('(CIRCUIT_NAME/text())[1]', 'nvarchar(255)') as CIRCUIT_NAME,
       T.X.value('(ADMIN/text())[1]', 'nvarchar(255)') as ADMIN,
       T.X.value('(PROTECTION/text())[1]', 'nvarchar(255)') as PROTECTION,
       T.X.value('(SOURCEREROUTE/text())[1]', 'nvarchar(255)') as SOURCEREROUTE,
       T.X.value('(TRUNKRESTORATION/text())[1]', 'nvarchar(255)') as TRUNKRESTORATION,
       T.X.value('(FWDBW/text())[1]', 'nvarchar(255)') as FWDBW,
       T.X.value('(SOURCETYPE/text())[1]', 'nvarchar(255)') as SOURCETYPE,
       T.X.value('(SOURCEIP/text())[1]', 'nvarchar(255)') as SOURCEIP,
       T.X.value('(SOURCECHASSIS/text())[1]', 'nvarchar(255)') as SOURCECHASSIS,
       T.X.value('(SOURCESLOT/text())[1]', 'nvarchar(255)') as SOURCESLOT,
       T.X.value('(SOURCEPORT/text())[1]', 'nvarchar(255)') as SOURCEPORT,
       T.X.value('(SOURCECHANNEL/text())[1]', 'nvarchar(255)') as SOURCECHANNEL,
       T.X.value('(DESTINATIONTYPE/text())[1]', 'nvarchar(255)') as DESTINATIONTYPE,
       T.X.value('(DESTINATIONIP/text())[1]', 'nvarchar(255)') as DESTINATIONIP,
       T.X.value('(DESTINATIONCHASSIS/text())[1]', 'nvarchar(255)') as DESTINATIONCHASSIS,
       T.X.value('(DESTINATIONSLOT/text())[1]', 'nvarchar(255)') as DESTINATIONSLOT,
       T.X.value('(DESTINATIONPORT/text())[1]', 'nvarchar(255)') as DESTINATIONPORT,
       T.X.value('(DESTINATIONCHANNEL/text())[1]', 'nvarchar(255)') as DESTINATIONCHANNEL,
       **T.X.value('(CIRCUITPATH/text())[1]', 'varchar(8000)')  as CIRCUITPATH,
       T.X.value('(CIRCUITPROTECTPATH/text())[1]', 'varchar(8000)') as CIRCUITPROTECTPATH,**
       T.X.value('(REVERSION/text())[1]', 'nvarchar(255)') as REVERSION,
       T.X.value('(CG_NET_INSTANCE/text())[1]', 'nvarchar(255)') as CG_NET_INSTANCE,
       T.X.value('(PARENT_HPKEY/text())[1]', 'nvarchar(255)') as PARENT_HPKEY

from @XML.nodes('/SilvxInSightImport/Tables/Table[@Name = "Circuit"]/TableData/Row') as T(X)

粗体代码就是问题所在。我已经检查了目标表(SILVX_CIRCUIT),并将CIRCUITPATH和CIRCUITPROTECTPATCH字段的数据类型更改为VARCHAR(8000),但仍然得到错误。如果我将上述参数从varchar(8000)设置为varchar(255),那么它运行时不会出错,但会按照您的预期将数据截断为255。我不确定我做错了什么。提前感谢您帮助一个noob

也许你可以改变这一点:

varchar(8000)
为此:

varchar(max)

如果仔细检查
INSERT
语句中的列如何与
SELECT
语句选择的列相匹配,则会发现插入的是
CIRCUITPATH
而不是
destinationchannel


destinationchannel
NVARCHAR(255)
,而
CIRCUITPATH
VARCHAR(8000)
,因此您会得到一个错误。

我首先尝试了,结果相同。此外,电路路径和电路保护路径字段中的大部分数据长度都在100到600个字符之间。不确定是否还有一个编程方面,如果是这样,您可能会考虑采取这些数据并先压缩它,然后将其作为二进制数据传递。不知道这在你的情况下是否可行……你发布的查询有点问题:第22个参数:destinationport->DESTINATIONCHANNEL(?)@Kevin\S不客气。你可以接受这篇文章作为你问题的答案,如果它真的帮助你解决了问题,那么其他有类似问题的人可能会从这篇文章中受益。