【问题标题】:SQL Server: Row_Number() order by sort by xml data order [duplicate]SQL Server:Row_Number()按xml数据顺序排序[重复]
【发布时间】:2022-01-09 18:07:50
【问题描述】:

我正在提取 XML 数据。我用它创建临时表。但我希望根据 xml 数据的顺序进行排序。我该怎么做?

程序:

ALTER PROCEDURE [dbo].[diziDonustur]
@date xml = null,
@islem xml = null
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @degisken int

    EXEC sp_xml_preparedocument @degisken OUTPUT, @date

    select 
    akt = ROW_NUMBER() OVER(ORDER BY cektar),
    cektar 
    into #tmp
    from cek 
    where cektar in (
      SELECT Convert(datetime,Convert(nvarchar,text)) FROM OPENXML (@degisken, '/ArrayOfDateTime/dateTime') where text is not null 
    )
    group by cektar

    
    
    exec sp_xml_removedocument @degisken;  



    EXEC sp_xml_preparedocument @degisken OUTPUT, @islem

    SELECT akt = ROW_NUMBER() OVER(ORDER BY Islem),Islem INTO #tmp4 from(
        SELECT Convert(decimal,Convert(nvarchar,text)) as Islem FROM OPENXML (@degisken, '/ArrayOfDecimal/decimal') where text is not null 
    )a--here I want to sort by xml data itself, not by operation


    
    select cektar,Islem into #tmpXmlBirlesim from #tmp inner join #tmp4 on #tmp.akt = #tmp4.akt
    select * from #tmpXmlBirlesim
END

运行程序:

exec diziDonustur @islem = '<?xml version="1.0"?>
<ArrayOfDecimal xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <decimal>4000000</decimal>
  <decimal>343</decimal>
  <decimal>4000000</decimal>
</ArrayOfDecimal>', @date = '<?xml version="1.0"?>
<ArrayOfDateTime xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <dateTime>2021-12-18T00:00:00</dateTime>
  <dateTime>2021-12-19T00:00:00</dateTime>
  <dateTime>2021-12-20T00:00:00</dateTime>
</ArrayOfDateTime>'

在 #tmp4 中分配 row_number() 时,我按 Islem 列进行排序。但随后它从最小的数字排序。我想按 XML 中的顺序排序,而不是按 Transaction 列。

也就是说,无论 XML 数据以何种顺序出现在我面前,它都应该按该顺序放置在 #tmp4 表中。

例如:

'<?xml version="1.0"?>
<ArrayOfDecimal xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <decimal>4000000</decimal> --should be number 1 in this table
  <decimal>343</decimal> --should be number 2 in this table
  <decimal>4000000</decimal> --should be number 3 in this table
</ArrayOfDecimal>'

【问题讨论】:

  • @user2864740 my sql server 2019.会有区别吗?
  • @Serg 是的,但它在我的代码中不起作用。它给出了一个错误。或者我不能。我们如何使其适应我的代码,请帮助
  • @Serg 错误:'(' 附近的语法不正确。因为 T(X) 不接受
  • 不要使用那些旧的系统程序来消费 XML;它们是为了与 非常 旧的数据库兼容。 SQL Server 自 2005 年起就支持 XQuery。

标签: sql sql-server xml row-number sql-server-2019


【解决方案1】:

关注previous answer

declare @islem xml = '<?xml version="1.0"?>
<ArrayOfDecimal xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <decimal>4000000</decimal>
  <decimal>343</decimal>
  <decimal>4000000</decimal>
</ArrayOfDecimal>';

with Numbers(Number) as(
-- quick inline tally
 select 1 union all 
 select 2 union all 
 select 3 
)
 
select T.X.value('text()[1]', 'nvarchar(100)') as RowLabel,
       N.Number as RowNumber
from Numbers as N
cross apply @islem.nodes('ArrayOfDecimal/decimal[sql:column("N.Number")]') as T(X)
where N.Number between 1 and @islem.value('count(ArrayOfDecimal/decimal)', 'int');

您可能希望创建一个持久的Numbers 计数表,而不是查询中的快速示例。

【讨论】:

  • 我后来自己解决了。不过还是谢谢你
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2011-08-31
  • 2014-05-14
  • 2015-04-29
  • 2014-12-21
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多