Tsql T-SQL:使用ROW_NUMBER()为XML分页-未返回子节点

Tsql T-SQL:使用ROW_NUMBER()为XML分页-未返回子节点,tsql,pagination,row-number,for-xml,Tsql,Pagination,Row Number,For Xml,我正在运行以下查询 SELECT ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx, [Transactions].[ID] AS [id], [Transactions].[EncryptedAccountID] AS [encryptedAccountID], [Transactions].[Uploaded] AS [uploaded], [Transactions].[Visib

我正在运行以下查询

SELECT
    ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx,
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [fieldId],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [valueVisible],
    [TransactionValues].[ID] AS [valueId],
    [TransactionValues].[FieldID] AS [valueFieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId]
FROM
    [Transactions]
    INNER JOIN [TransactionValues]
    ON [TransactionValues].[TransactionID] = [Transactions].[ID]
    INNER JOIN [Fields]
    ON [TransactionValues].[FieldID] = [Fields].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @encryptedAccountID
FOR XML AUTO, ROOT('root')
它以以下格式返回XML(我省略了返回的属性值-这些值不相关):


到目前为止还不错

现在,我想对结果进行分页。这部分要求将上述查询作为子查询运行。因此,我现在有以下问题:

SELECT
*
FROM
(
    SELECT
        ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx,
        [Transactions].[ID] AS [id],
        [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
        [Transactions].[Uploaded] AS [uploaded],
        [Transactions].[Visible] AS [visible],
        [Fields].[ID] AS [fieldId],
        [Fields].[FriendlyName] AS [friendlyName],
        [Fields].[OfficialName] AS [officialName],
        [Fields].[Order] AS [order],
        [Fields].[Visible] AS [valueVisible],
        [TransactionValues].[ID] AS [valueId],
        [TransactionValues].[FieldID] AS [valueFieldId],
        [TransactionValues].[FriendlyValue] AS [friendlyValue],
        [TransactionValues].[OfficialValue] AS [officialValue],
        [TransactionValues].[TransactionID] AS [transactionId]
    FROM
        [Transactions]
        INNER JOIN [TransactionValues]
        ON [TransactionValues].[TransactionID] = [Transactions].[ID]
        INNER JOIN [Fields]
        ON [TransactionValues].[FieldID] = .[Fields].[ID]
    WHERE
        [Transactions].[EncryptedAccountID] = @encryptedAccountID
) AS [TransactionInfo]
WHERE
    idx > 5
AND
    idx <= 20
ORDER BY
    [id], [order] ASC
FOR XML AUTO, ROOT('root')
选择
*
从…起
(
挑选
(按[TransactionValues].[ID]排序)上的行号()作为idx,
[Transactions].[ID]作为[ID],
[Transactions]。[EncryptedAccountID]作为[EncryptedAccountID],
[交易][上传]为[上传],
[交易].[可见]为[可见],
[Fields].[ID]作为[fieldId],
[字段][FriendlyName]作为[FriendlyName],
[字段].[OfficialName]作为[OfficialName],
[字段][订单]作为[订单],
[Fields].[Visible]作为[valueVisible],
[TransactionValues]。[ID]作为[valueId],
[TransactionValues]。[FieldID]作为[valueFieldId],
[TransactionValues]。[FriendlyValue]作为[FriendlyValue],
[TransactionValues]。[OfficialValue]作为[OfficialValue],
[TransactionValues]。[TransactionID]作为[TransactionID]
从…起
[交易]
内部联接[TransactionValues]
在[TransactionValues].[TransactionID]=[Transactions].[ID]上
内部联接[字段]
在[TransactionValues].[FieldID]=[Fields].[ID]上
哪里
[事务].[EncryptedAccountID]=@EncryptedAccountID
)AS[交易信息]
哪里
idx>5
及

idx它并不漂亮,但是这个怎么样:

SELECT
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [fieldId],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [valueVisible],
    [TransactionValues].[ID] AS [valueId],
    [TransactionValues].[FieldID] AS [valueFieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId],
    [TransactionValues].idx
FROM
    [Transactions]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx
        FROM [TransactionValues]
    ) AS [TransactionValues]
        ON [TransactionValues].[TransactionID] = [Transactions].[ID]
    INNER JOIN [Fields]
        ON [TransactionValues].[FieldID] = .[Fields].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @encryptedAccountID
    AND [TransactionValues].idx BETWEEN 5 AND 20
FOR XML AUTO, ROOT('root')

谢谢@Justin Pihoney,以下是我的解决方案:

SELECT
    [Transactions].[AssignedID],
    [Transactions].[idx],
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [id],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [visible],
    [TransactionValues].[ID] AS [id],
    [TransactionValues].[FieldID] AS [fieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId]
FROM
    [TransactionValues]
    INNER JOIN [Fields]
    ON [TransactionValues].[FieldID] = .[Fields].[ID]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [Transactions].[AssignedID]) AS [idx]
        FROM [Transactions]
    ) AS [Transactions]
    ON [TransactionValues].[TransactionID] = [Transactions].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @EncryptedAccountID
AND
    [Transactions].[idx] BETWEEN 5 AND 20
ORDER BY
    [Transactions].[AssignedID]
FOR XML AUTO, ROOT('root')

此外,为了完整起见,“介于5和20之间”将被参数替换。

这会产生错误:“窗口函数只能出现在SELECT或ORDER by子句中。”贾斯汀说,差不多就是这样。您的查询返回了错误的嵌套顺序(TransactionValue是最外面的,里面是字段,里面是事务)。我花了几分钟的时间来改变这个。您添加的新子查询不允许我按TransactionValue.ID对事务进行排序,因此我为事务添加了一个新的自动分配int(现在是主键的一部分)。总之,经过一点调整,我达到了目的。为了子孙后代,我应该在下面发布完整的查询解决方案吗?@awj我更新了我的答案,将idx放在底部,现在可以适当嵌套了。然而,用你最终使用的东西进行更新并没有什么坏处。如果这个答案对你有帮助,那么你总是很感激向上投票,如果它把你推向了正确的方向,那么你会特别感激接受。不管怎样,总是很乐意帮忙!
SELECT
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [fieldId],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [valueVisible],
    [TransactionValues].[ID] AS [valueId],
    [TransactionValues].[FieldID] AS [valueFieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId],
    [TransactionValues].idx
FROM
    [Transactions]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx
        FROM [TransactionValues]
    ) AS [TransactionValues]
        ON [TransactionValues].[TransactionID] = [Transactions].[ID]
    INNER JOIN [Fields]
        ON [TransactionValues].[FieldID] = .[Fields].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @encryptedAccountID
    AND [TransactionValues].idx BETWEEN 5 AND 20
FOR XML AUTO, ROOT('root')
SELECT
    [Transactions].[AssignedID],
    [Transactions].[idx],
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [id],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [visible],
    [TransactionValues].[ID] AS [id],
    [TransactionValues].[FieldID] AS [fieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId]
FROM
    [TransactionValues]
    INNER JOIN [Fields]
    ON [TransactionValues].[FieldID] = .[Fields].[ID]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [Transactions].[AssignedID]) AS [idx]
        FROM [Transactions]
    ) AS [Transactions]
    ON [TransactionValues].[TransactionID] = [Transactions].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @EncryptedAccountID
AND
    [Transactions].[idx] BETWEEN 5 AND 20
ORDER BY
    [Transactions].[AssignedID]
FOR XML AUTO, ROOT('root')