SQL 服务器:Row_Number() order by sort by xml 数据顺序
SQL Server: Row_Number() order by sort by xml data order
我正在提取 XML 数据。我用它创建临时 table。但我希望根据 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 中的顺序排序,而不是按交易列排序。
也就是说,无论 XML 数据以何种顺序出现,它都应该按该顺序放在 #tmp4 table 中。
例如:
'<?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>'
关注 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
计数 table 而不是查询中的快速样本。
我正在提取 XML 数据。我用它创建临时 table。但我希望根据 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 中的顺序排序,而不是按交易列排序。
也就是说,无论 XML 数据以何种顺序出现,它都应该按该顺序放在 #tmp4 table 中。
例如:
'<?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>'
关注 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
计数 table 而不是查询中的快速样本。