使用带有nvarchar键的ROW_NUMBER

时间:2017-02-06 12:34:03

标签: sql sql-server key row-number nvarchar

我最近被一位前同事分配了一个项目,涉及使用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,因为该键在几乎所有行中都包含非数​​字字符。表中没有其他关键字段,并且手动添加一个是不可行的,因为:

  1. 表格中有5500多行。
  2. SAP不支持其表在SQL后端受UPDATE的影响,并在检测到不一致时锁定数据库。
  3. 我无法改变XML结构,因为那时另一方的API不会接受它。

    所以我的问题是:有没有办法将ROW_NUMBER()nvarchar密钥一起使用?或者ROW_NUMBER()替代使用非数字键?

2 个答案:

答案 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');