Sql server 如何查找SQL Server*.ndf文件内容

Sql server 如何查找SQL Server*.ndf文件内容,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我需要从生产数据库中删除一些旧文件,这些文件是分区表的一部分。所以,步骤如下-我删除了理论上由配分函数保存在那里的数据(所有数据都来自2007年) 然后我合并当年的配分函数: ALTER PARTITION FUNCTION pfPeriod() MERGE RANGE (2007); 然后,我想删除文件和文件组: ALTER DATABASE mydatabase REMOVE FILE tbProperty2007 ALTER DATABASE mydatabase REMOVE FILE

我需要从生产数据库中删除一些旧文件,这些文件是分区表的一部分。所以,步骤如下-我删除了理论上由配分函数保存在那里的数据(所有数据都来自2007年)

然后我合并当年的配分函数:

ALTER PARTITION FUNCTION pfPeriod() MERGE RANGE (2007);
然后,我想删除文件和文件组:

ALTER DATABASE mydatabase REMOVE FILE tbProperty2007
ALTER DATABASE mydatabase REMOVE FILEGROUP fgProperty2007
select ps.name as partition_scheme_name,
    dds.destination_id as parition_number,
    d.name as filegroup_name
from sys.partition_schemes ps
join sys.destination_data_spaces dds
    on ps.data_space_id = dds.partition_scheme_id
join sys.data_spaces d
    on d.data_space_id = dds.data_space_id;
  • 一切照章办事
我得到了一个错误:

无法删除文件“tbProperty2007”,因为它不是空的。
无法删除文件组“fgProperty2007”,因为它不是空的

我以前做过这个过程(对于2005年、2006年),文件不会删除(对于另一个表)的原因是索引——它保存在一个文件中(我意外地在表的分区中创建了索引)。在我在另一个文件组中重新创建索引后,我可以毫无困难地删除文件和文件组

无论如何,这次我在另一个文件组中重新创建了索引,但仍然无法删除该文件和文件组

那么,有谁能告诉我如何查看*.ndf文件的内容,或者为什么该文件不删除?(请)

另外,这可能是SQLServer2012的一个缺陷——我可以在SQLServer2005上删除文件,但在2012年我不能这样做

使用如下查询:

select t.name as table_name,
    i.name as index_name,
    ds.name as data_space_name,
    ds.type_desc,
    ps.name as partition_scheme_name
from sys.tables t
join sys.indexes i on t.object_id = i.object_id
join sys.data_spaces ds on i.data_space_id = ds.data_space_id
left join sys.partition_schemes ps on ps.data_space_id = ds.data_space_id;
这将向您显示哪些索引承载在哪些索引上。您可以查看文件组
fgProperty2007
中是否有非分区索引或表

您还可以使用如下查询来确定是否有任何分区方案仍然使用该文件组:

ALTER DATABASE mydatabase REMOVE FILE tbProperty2007
ALTER DATABASE mydatabase REMOVE FILEGROUP fgProperty2007
select ps.name as partition_scheme_name,
    dds.destination_id as parition_number,
    d.name as filegroup_name
from sys.partition_schemes ps
join sys.destination_data_spaces dds
    on ps.data_space_id = dds.partition_scheme_id
join sys.data_spaces d
    on d.data_space_id = dds.data_space_id;

非常感谢-这些问题正是我一直在寻找的。不幸的是,它没有帮助-两个脚本结果都没有提到fgProperty2007,但我仍然无法删除它-我得到的文件和文件组的错误相同(如果文件组“正在使用”,则该文件也在使用中,因此两个文件都出现相同错误是正常的。是的,我同意-必须先删除该文件。但如果文件为空且无法删除它,则不正常。我的查询将连接
sys.tables
,因此它将只显示用户表。您是否可以尝试连接sys.objects并检查是否存在某些用户表内部表不在此FG中?可能是队列、更改跟踪表或类似表。此外,我假设您具有查看数据库中所有对象所需的权限(即,由于权限较低,不允许查看FG中的用户表)。我有管理员权限,我查看所有表-这不是问题。我只是放弃并使用了带有emptyfile选项的shrinkfile-这很有帮助,我很高兴。我将您的评论标记为答案,因为我的问题是关于这些查询的,您真的帮助了我克服了我的妄想症,谢谢。我放弃并使用emptyfile选项制作了shrinkfile它帮助“DBCC SHRINKFILE('tbProperty2007',EMPTYFILE'),然后我就可以删除文件了。