我最近被一位前同事分配了一个项目,涉及使用SQL Server作为Web后端同步SAP库存信息。其中一部分涉及生成XML文件 - 这就是我的困境所在。
在我必须遵循的XML结构中,每个清单项都包含在带有数字ID的Message
元素中,有点像这样:
<Messages>
<Message>
<MessageID>1</MessageID>
<first item />
</Message>
<Message>
<MessageID>2</MessageID>
<second item />
</Message>
</Messages>
MessageID
字段用作行号:它从1递增到结果集中的行数。问题是,表的主键是nvarchar
,但ROW_NUMBER() OVER( ORDER BY )
需要bigint
键,因此以下代码:
SELECT
ROW_NUMBER() OVER(ORDER BY items.ItemCode) MessageID,
items.ItemCode as SKU
FROM OITM items
FOR XML PATH('Message'), ROOT('Messages')
失败
将数据类型varchar转换为数字
时出错
无法将ItemCode
转换为bigint
,因为该键在几乎所有行中都包含非数字字符。表中没有其他关键字段,并且手动添加一个是不可行的,因为:
UPDATE
的影响,并在检测到不一致时锁定数据库。我无法改变XML结构,因为那时另一方的API不会接受它。
所以我的问题是:有没有办法将ROW_NUMBER()
与nvarchar
密钥一起使用?或者ROW_NUMBER()
替代使用非数字键?
答案 0 :(得分:1)
... d&#39;哦,这个错误是由完全不同的一行给出的。我看起来也是盲人和愚蠢的人。
随意对问题进行评分,因为我完全配得上。
答案 1 :(得分:0)
将row_number()
投射到字符串:
SELECT CAST(ROW_NUMBER() OVER (ORDER BY items.ItemCode) as VARCHAR(255)) as MessageID,
items.ItemCode as SKU
FROM OITM items
FOR XML PATH('Message'), ROOT('Messages');