我是SQL Server partitioning的新手。我尝试了一些教程,最后我得到了基于它的这,创建了一个分区,但问题是,我不能像在MYSQL查询中那样根据分区检索数据
SELECT * FROM TABLE_NAME PARTITION(partitionId)并在SQL Server中尝试了这个查询。
SELECT $PARTITION.partition_function (partition_function_id)编辑:

图中显示了表中基于日期创建分区的数据,我喜欢根据分区名称检索数据,即如果分区名为20170203,则排除该日期的结果。
发布于 2019-11-22 06:38:25
select * from TABLE_NAME
where $partition.fpartfunction(date) = 1这将返回分区1中的所有数据。
如果你想从你可以这样做的日期检索它,
CREATE PARTITION FUNCTION PF_Date(date) AS RANGE LEFT FOR VALUES('2017-01-01','2018-01-01');--first partition
SELECT *
FROM schema.table_name
WHERE key_column <= '2017-01-01';
--second partition
SELECT *
FROM schema.table_name
WHERE key_column > '2017-01-01' AND key_column <= '2018-01-01';
--last partition
SELECT *
FROM schema.table_name
WHERE key_column > '2018-01-01';发布于 2019-11-22 22:26:18
我希望这能满足你的需要:
CREATE PROCEDURE USP_GetRowsWithinPartition (@InputDate DATE)
AS
BEGIN
DECLARE @TV TABLE
(StartDate DATE,
EndDate DATE
)
INSERT INTO @TV (StartDate, EndDate)
SELECT TOP 1
CAST((CASE
WHEN (DATEPART(MONTH, @InputDate)) = 7 AND (DATEPART(DAY, @InputDate)) > 2
THEN DATEADD(YEAR, -1, CONVERT(DATE, prv.Value, 116))
WHEN (DATEPART(MONTH, @InputDate)) > 7 AND (DATEPART(DAY, @InputDate)) >= 1
THEN DATEADD(YEAR, -1, CONVERT(DATE, prv.Value, 116))
ELSE prv.Value
END) AS DATE) AS StartDate,
CAST((CASE
WHEN (DATEPART(MONTH, @InputDate)) = 7 AND (DATEPART(DAY, @InputDate)) > 2
THEN prv.Value
WHEN (DATEPART(MONTH, @InputDate)) > 7 AND (DATEPART(DAY, @InputDate)) >= 1
THEN prv.Value
ELSE DATEADD(YEAR, 1, CONVERT(DATE, prv.Value, 116))
END ) AS DATE) AS EndDate
FROM sys.partition_functions pf
INNER JOIN sys.partition_schemes AS ps ON ps.function_id = pf.function_id
INNER JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.dm_db_partition_stats pstats ON pstats.partition_number = dds.destination_id
INNER JOIN sys.partitions p ON p.partition_id = pstats.partition_id
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_range_values AS prv ON pf.function_id = prv.function_id
WHERE pstats.object_id = OBJECT_ID('YourTable')
GROUP BY prv.boundary_id, prv.value
ORDER BY ABS(DATEDIFF(DAY, @InputDate, Convert(DATE, value, 116)))
SELECT yt.* FROM YourTable yt
INNER JOIN @TV t ON yt.DateColumn>=t.StartDate AND yt.DateColumn < t.EndDate
END
EXEC USP_GetRowsWithinPartition '2015-08-01' 发布于 2019-12-22 21:39:51
(MySQL)
访问特定的PARTITION几乎没有任何用处。您应该让WHERE子句选择使用哪个分区。
此外,分区的用途很少。我建议您忽略该功能,直到您有了大量的经验在您的腰带。
任何回答你的问题..。是的,这应该是可行的:
SELECT * FROM TABLE_NAME PARTITION(partitionId);但直到5.6才能得到这一数字。
可能需要引用分区is,特别是如果它是一个数字。如需进一步研究,请提供SHOW CREATE TABLE。
https://stackoverflow.com/questions/58987633
复制相似问题