Transact-SQL을 사용하여 FILESTREAM 데이터 액세스
적용 대상: SQL Server
이 문서에서는 Transact-SQL INSERT, UPDATE 및 DELETE 문을 사용하여 FILESTREAM 데이터를 관리하는 방법을 설명합니다.
참고 항목
이 항목의 예에서는 FILESTREAM 사용 데이터베이스 만들기 및 FILESTREAM 데이터 저장용 테이블 만들기에서 만든 FILESTREAM 사용 데이터베이스 및 테이블이 필요합니다.
FILESTREAM 데이터가 들어 있는 행 삽입
FILESTREAM 데이터를 지원하는 테이블에 행을 추가하려면 Transact-SQL INSERT 문을 사용합니다. FILESTREAM 열에 데이터를 삽입할 때 NULL 또는 varbinary(max) 값을 삽입할 수 있습니다.
NULL 삽입
다음 예제에서는 NULL
를 삽입하는 방법을 보여 줍니다. FILESTREAM 값이 NULL
이면 Database Engine이 파일 시스템에 파일을 만들지 않습니다.
INSERT INTO Archive.dbo.Records
VALUES (NEWID(), 1, NULL);
GO
길이가 0인 레코드 삽입
다음 예제에서는 INSERT
을 사용하여 영 길이의 레코드를 만드는 방법을 보여 줍니다. 길이가 0인 레코드는 파일 핸들을 가져와야 하지만 Win32 API를 사용하여 파일을 조작하는 경우에 유용합니다.
INSERT INTO Archive.dbo.Records
VALUES (NEWID(), 2,
CAST ('' AS VARBINARY(MAX)));
GO
데이터 파일 만들기
다음 예제는 INSERT
을 사용하여 데이터를 포함하는 파일을 만드는 방법을 보여줍니다. 데이터베이스 엔진 문자열 Seismic Data
을 varbinary(max)
값으로 변환합니다. FILESTREAM이 아직 없는 경우 Windows 파일을 만듭니다. 그런 다음 데이터가 데이터 파일에 추가됩니다.
INSERT INTO Archive.dbo.Records
VALUES (NEWID(), 3,
CAST ('Seismic Data' AS VARBINARY(MAX)));
GO
Archive.dbo.Records
표에서 모든 데이터를 선택하면 다음 표에 표시된 결과와 비슷한 결과가 나옵니다. 그러나 Id
열에는 다른 GUID가 포함됩니다.
ID | SerialNumber | 차트 |
---|---|---|
C871B90F-D25E-47B3-A560-7CC0CA405DAC |
1 |
NULL |
F8F5C314-0559-4927-8FA9-1535EE0BDF50 |
2 |
0x |
7F680840-B7A4-45D4-8CD5-527C44D35B3F |
3 |
0x536569736D69632044617461 |
FILESTREAM 데이터 업데이트
Transact-SQL을 사용하여 파일 시스템 파일의 데이터를 업데이트할 수 있지만 많은 양의 데이터를 파일로 스트리밍할 때는 원하지 않을 수 있습니다.
다음 예에서는 파일 레코드에 있는 임의의 텍스트를 Xray 1
로 바꿉니다.
UPDATE Archive.dbo.Records
SET [Chart] = CAST('Xray 1' AS VARBINARY(MAX))
WHERE [SerialNumber] = 2;
FILESTREAM 데이터 삭제
FILESTREAM 필드가 있는 행을 삭제하면 해당 내부 파일 시스템 파일도 삭제됩니다. 행 및 연결된 파일을 삭제하는 유일한 방법은 Transact-SQL DELETE 문을 사용하는 것입니다.
다음 예제에서는 행 및 연결된 파일 시스템 파일을 삭제하는 방법을 보여줍니다.
DELETE Archive.dbo.Records
WHERE SerialNumber = 1;
GO
Archive.dbo.Records
테이블에서 모든 데이터를 선택하면 행이 삭제되고 관련 파일도 더 이상 사용할 수 없게 됩니다.
참고 항목
기본 파일은 FILESTREAM 가비지 수집기를 통해 제거됩니다.
테이블 또는 데이터베이스에 FILESTREAM 데이터가 포함되어 있는지 확인
데이터베이스 또는 테이블에 FILESTREAM 데이터가 포함되어 있는지 확인하려면 시스템 뷰를 쿼리해야 합니다.
다음 확장 예제에서는 새 데이터베이스를 만들고, FILESTREAM 데이터가 있는 테이블을 만들고, 시스템 뷰를 쿼리하여 테이블과 데이터베이스 자체에 FILESTREAM 데이터가 포함되어 있는지 여부를 확인하는 단계를 보여 줍니다.
USE [master];
GO
-- Create database with FILESTREAM
CREATE DATABASE [FileStreamTest] CONTAINMENT = NONE ON PRIMARY (
NAME = N'FileStreamTest'
, FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FileStreamTest.mdf'
, SIZE = 204800 KB
, MAXSIZE = UNLIMITED
, FILEGROWTH = 65536 KB
)
, FILEGROUP [FileStreamFG] CONTAINS FILESTREAM DEFAULT(NAME = N'FileStreamTestFStream', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FileStreamTestFStream', MAXSIZE = UNLIMITED) LOG ON (
NAME = N'FileStreamTest_log'
, FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FileStreamTest_log.ldf'
, SIZE = 270336 KB
, MAXSIZE = 2048 GB
, FILEGROWTH = 65536 KB
)
WITH CATALOG_COLLATION = DATABASE_DEFAULT;
GO
USE [FileStreamTest];
GO
CREATE TABLE FSTiffs (
Guid UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWSEQUENTIALID()
, DocumentID INT NOT NULL
, DocumentType VARCHAR(10) NOT NULL
, FileContent VARBINARY(MAX) FILESTREAM NOT NULL
, DateInserted DATETIME
);
-- Which database and files use FILESTREAM
SELECT db_name(database_id) dbname
, name AS file_name
, physical_name
, type_desc
, *
FROM sys.master_files
WHERE type_desc = 'FILESTREAM';
-- Which tables in the database have FILESTREAM enabled
USE [FileStreamTest]
GO
SELECT *
FROM sys.tables
WHERE filestream_data_space_id IS NOT NULL;
--insert a TIFF file
INSERT INTO FSTiffs (
DocumentID
, DocumentType
, FileContent
, DateInserted
)
SELECT 101
, '.tiff'
, *
, GETDATE()
FROM OPENROWSET(BULK N'C:\Temp\Sample1.tiff', SINGLE_BLOB) rs;
-- Select data from FILESTREAM table
SELECT *
FROM FSTiffs;
-- Update a document
UPDATE FSTiffs
SET FileContent = (
SELECT *
FROM OPENROWSET(BULK N'C:\Temp\Sample2.tiff', SINGLE_BLOB) AS rs
)
WHERE DocumentID = 101;
-- Delete a document
DELETE FSTiffs
WHERE DocumentID = 101;
--clean up any delete files
EXEC sp_filestream_force_garbage_collection @dbname = N'FileStreamTest'
, @filename = N'FileStreamTestFStream';