【发布时间】:2020-06-09 09:38:49
【问题描述】:
我有一个 SQL Server 数据库。
您可以使用以下脚本创建类似的数据库:
CREATE DATABASE [test]
CONTAINMENT = NONE
ON PRIMARY
(NAME = N'test', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ),
FILEGROUP [FS] CONTAINS FILESTREAM DEFAULT
(NAME = N'FS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS' , MAXSIZE = UNLIMITED)
LOG ON
(NAME = N'test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test_log.ldf', SIZE = 8192KB, MAXSIZE = 2048GB, FILEGROWTH = 65536KB )
GO
如何选择所有数据库文件已经很清楚了:
select * from sys.database_files
file_id file_guid type type_desc data_space_id name physical_name state state_desc size max_size growth is_media_read_only is_read_only is_sparse is_percent_growth is_name_reserved is_persistent_log_buffer create_lsn drop_lsn read_only_lsn read_write_lsn differential_base_lsn differential_base_guid differential_base_time redo_start_lsn redo_start_fork_guid redo_target_lsn redo_target_fork_guid backup_lsn
----------- ------------------------------------ ---- ------------------------------------------------------------ ------------- -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----- ------------------------------------------------------------ ----------- ----------- ----------- ------------------ ------------ --------- ----------------- ---------------- ------------------------ --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ------------------------------------ ----------------------- --------------------------------------- ------------------------------------ --------------------------------------- ------------------------------------ ---------------------------------------
1 07DE2F09-B9C3-4CC9-AC7F-C7BBEDBFE572 0 ROWS 1 test C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test.mdf 0 ONLINE 1024 -1 8192 0 0 0 0 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2 25C00910-F2F0-48EF-8AE6-DB3E947DF0F3 1 LOG 0 test_log C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test_log.ldf 0 ONLINE 1024 268435456 8192 0 0 0 0 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
65537 DB6C446D-E1E1-4F5B-BC27-92168A94A92B 2 FILESTREAM 2 FS C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS 0 ONLINE 0 -1 0 0 0 0 0 0 0 36000000012900001 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
(3 rows affected)
现在让我们创建一个带有 blob 的表:
USE [test]
CREATE TABLE TestBlob
(
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[tbBin] VARBINARY(MAX) FILESTREAM NULL
)
GO
然后放一些数据:
USE [test]
INSERT INTO TestBlob (Id, tbBin)
SELECT NEWID(), BulkColumn FROM OPENROWSET(Bulk 'C:\Everyone\small', Single_Blob) AS tb
INSERT INTO TestBlob (Id, tbBin)
SELECT NEWID(), BulkColumn FROM OPENROWSET(Bulk 'C:\Everyone\another', Single_Blob) AS tb
现在 blob 文件夹如下所示:
cmd> tree "C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS" /F
C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS
│ filestream.hdr
│
├───$FSLOG
└───f4bf1197-bb52-4246-95ba-4b7622065c19
└───4cf08168-3853-4c3d-ada2-4a1ff8d19900
00000024-000000b1-0002
00000024-000000cd-0002
我需要一个 T-SQL 查询来选择数据库的所有 blob 文件。
这是以下文件(我的数据库使用它们):
00000024-000000b1-0002
00000024-000000cd-0002
有人可以帮我吗?
我也知道可以使用未记录的存储过程:
EXEC master.sys.xp_dirtree 'C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS',0,1;
subdirectory depth file
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- -----------
$FSLOG 1 0
f4bf1197-bb52-4246-95ba-4b7622065c19 1 0
4cf08168-3853-4c3d-ada2-4a1ff8d19900 2 0
00000024-000000b1-0002 3 1
00000024-000000cd-0002 3 1
filestream.hdr 1 1
(6 rows affected)
但它适用于文件系统。我的意思是它不考虑数据库是否使用文件。
【问题讨论】:
-
"我需要一个 t-sql 查询来选择数据库的所有 blob 文件。"为什么?
-
你为什么要这个?这不仅仅是一个 blob,它正在使用文件流存储。否则它将存储在数据库数据文件中。只需查询表将返回 blob。这些文件的位置是众所周知的,实际上它是在安装期间指定的。例如,没有理由将它们存储在
Program Files中。 -
如果您想将这些文件作为文件读取,您可以通过您使用的 SQL 客户端库来实现。例如,对于 ADO.NET,you can use SqlFileStream。你不需要知道他们的路径。
-
@DavidBrowne-Microsoft 一般来说,我需要将数据库使用的每个文件同步到某个存储
-
这将是可能的并且支持使用 FileTable,但不是 FileStream。 docs.microsoft.com/en-us/sql/relational-databases/blob/…
标签: sql sql-server tsql blob filestream