我正在使用 SQL Server 存储过程来生成一个数据表,我将其用作 WPF 数据网格的数据源。数据位于父 [Sample] 子 [SampleConstituent] 关系的两个表中,我正在使用 PIVOT 为子表中的数据记录生成列。该查询使用参数,以便我可以过滤返回到数据网格的记录。
我的问题是我想根据最近的记录从查询中返回一个 TOP N 结果集。我有以下存储过程,一切正常,除了数据总是首先返回最旧的记录。因此,TOP N
过滤器返回最旧的记录而不是最近的记录。Sample.SampleDateTime
是我希望排序的父表中的列。
我已经尝试了很多次迭代,以至于我的新手大脑都陷入了困境!
ALTER PROCEDURE [dbo].[spSampleDisplayAllParams]
-- Add the parameters for the stored procedure here
@fromDate DATE = '2013-01-01',
@toDate DATE = '2100-01-01',
@ProductName NVARCHAR(50) = '%',
@SampleNumber NVARCHAR(50) = '%',
@numSamples NVARCHAR(50) = 200
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ConstituentName)
from SampleConstituent
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
PRINT @cols
set @query
= 'SELECT top (' + @numSamples + ') * from
(SELECT TOP 100 PERCENT s.SampleID, s.SampleNumber, s.SampleDateTime, s.ProductName, sc.ConstituentName, sc.ConstituentValue
FROM dbo.Sample s INNER JOIN
dbo.SampleConstituent sc ON s.SampleID = sc.SampleID
WHERE (s.Active = 1) AND
(s.ProductName Like ''' + @ProductName + ''') AND
(s.SampleNumber Like ''' + @SampleNumber + ''') AND
(s.SampleDateTime BETWEEN ''' + CONVERT(nvarchar(24), @FromDate, 121) +''' AND'''+ CONVERT(nvarchar(24), @ToDate, 121) +''')
ORDER BY s.SampleDateTime ) x
pivot
(
max(ConstituentValue)
for ConstituentName in (' + @cols + ')
) p '
execute(@query)
END