다음을 통해 공유


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 Datavarbinary(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';

참고 항목