Mysql 从SQLServerTable中的分区检索数据

Mysql 从SQLServerTable中的分区检索数据,mysql,sql,sql-server,partitioning,Mysql,Sql,Sql Server,Partitioning,我不熟悉SQL Server分区。我已经尝试了一些教程,最后我基于它创建了一个分区,但问题是我不能像在MYSQLquery中那样检索基于分区的数据 SELECT * FROM TABLE_NAME PARTITION(partitionId) 并在SQL Server中尝试了此查询 SELECT $PARTITION.partition_function (partition_function_id) 编辑: 图中显示了我创建的基于日期的分区的表中的数据,我喜欢基于分区名称检索数据,即如

我不熟悉
SQL Server分区
。我已经尝试了一些教程,最后我基于它创建了一个分区,但问题是我不能像在
MYSQL
query中那样检索基于分区的数据

SELECT * FROM TABLE_NAME  PARTITION(partitionId)
并在SQL Server中尝试了此查询

SELECT $PARTITION.partition_function (partition_function_id)
编辑:

图中显示了我创建的基于日期的分区的表中的数据,我喜欢基于分区名称检索数据,即如果分区名称为20170203,我将在该日期排除结果

这将返回分区1中的所有数据

如果要从日期开始检索,可以按如下操作:

CREATE PARTITION FUNCTION PF_Date(date) AS RANGE LEFT FOR VALUES('2017-01-01','2018-01-01');
——第一个分区
挑选*
来自schema.table\u name
其中,关键字栏“2017-01-01”和关键字栏“2018-01-01”;

我希望这可以满足您的需要:

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'    
创建过程USP\u GetRowsWithinPartition(@InputDate)
作为
开始
声明@电视台
(开始日期,
结束日期
)
插入@TV(开始日期,结束日期)
选择前1名
铸造((例)
当(DATEPART(MONTH,@InputDate))=7和(DATEPART(DAY,@InputDate))>2时
然后日期添加(年份-1,转换(日期,prv.Value,116))
当(DATEPART(MONTH,@InputDate))>7和(DATEPART(DAY,@InputDate))>=1时
然后日期添加(年份-1,转换(日期,prv.Value,116))
其他prv值
结束)日期)开始日期,
铸造((例)
当(DATEPART(MONTH,@InputDate))=7和(DATEPART(DAY,@InputDate))>2时
然后是prv值
当(DATEPART(MONTH,@InputDate))>7和(DATEPART(DAY,@InputDate))>=1时
然后是prv值
ELSE DATEADD(年份,1,转换(日期,prv.值,116))
结束)作为日期)作为结束日期
来自sys.partition_函数pf
内部连接sys.partition\u方案作为ps ON ps.function\u id=pf.function\u id上的ps
内部连接sys.destination\u data\u spaces作为dds上的dds.partition\u scheme\u id=ps.data\u space\u id
内部连接sys.dm_db_partition_stats pstats ON pstats.partition_number=dds.destination_id
p.partition\u id=pstats.partition\u id上的内部联接sys.partitions p
内部连接sys.data\u空间作为dds上的ds.data\u空间\u id=ds.data\u空间\u id
内部连接sys.partition\u range\u值作为pf.function\u id=prv.function\u id上的prv
其中pstats.object_id=object_id('YourTable')
按prv.boundary\u id、prv.value分组
ABS订单(DATEDIFF(DAY,@InputDate,Convert(DATE,value,116)))
从表yt中选择yt.*
内部联接@TV t ON yt.DateColumn>=t.StartDate和yt.DateColumn
(MySQL)

访问特定的
分区几乎没有任何用处。您应该让
WHERE
子句选择要使用的分区

此外,分区的用途非常少。我建议你忽略这个特性,直到你有了相当多的经验

任何,回答你的问题。。。是的,这应该有效:

SELECT * FROM TABLE_NAME  PARTITION(partitionId);
但直到5.6才有了这一数据


可能需要引用partitionid,尤其是如果它是一个数字。为了进一步研究,请提供
SHOW CREATE TABLE

您可以共享表数据和预期输出吗?我已经做了编辑,请检查一下@HardikLeuwaHi@KGRed,如果您不介意的话,您可以简单地详细介绍一下代码。.连接中的系统视图用于定位特定表(YourTable)上的确切分区。---按ABS(DATEDIFF(秒,@InputDate,Convert(DATE,value,116))和TOP 1排序:从[sys].[partition\u range\u values]的“value”列中的值获取最接近的日期CASE语句:用于获取特定分区范围的开始和结束日期,在本例中为一年。7月3日为年中:输入日期在下半年时,前1个值将为结束日期,反之亦然。CASE语句用于获取开始和结束日期。是否仅限于SQL Server?
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'    
SELECT * FROM TABLE_NAME  PARTITION(partitionId);