Sql server SQL Server“;字符串或二进制数据将被截断;XML插入
我对SQL Server比较陌生。我的大部分背景是MS Access。我有一个存储过程,它接受一个XML文件并将节点信息插入16个不同的表中。我得到一个“字符串或二进制数据将被截断”错误。以下是导致问题的代码片段: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 =
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不客气。你可以接受这篇文章作为你问题的答案,如果它真的帮助你解决了问题,那么其他有类似问题的人可能会从这篇文章中受益。