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데이터베이스 엔진이 파일 시스템에 파일을 만들지 않습니다.

INSERT INTO Archive.dbo.Records
    VALUES (NEWID(), 1, NULL);
GO

길이가 0인 레코드 삽입

다음 예제에서는 길이가 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';

참고 항목