Přístup k datům FILESTREAM pomocí Transact-SQL

platí pro:SQL Server

Tento článek popisuje, jak používat Transact-SQL INSERTUPDATE, a DELETE příkazy ke správě dat FILESTREAM.

Poznámka:

Příklady v tomto článku vyžadují databázi a tabulku s podporou FILESTREAM, které jsou vytvořeny v části Vytvoření databáze FILESTREAM-Enabled a vytvoření tabulky pro ukládání dat FILESTREAM.

Vložení řádku obsahujícího data FILESTREAM

Pokud chcete přidat řádek do tabulky, která podporuje data FILESTREAM, použijte příkaz Transact-SQL INSERT . Při vkládání dat do sloupce FILESTREAM můžete vložit hodnotu NULL nebo varbinary(max).

Vložit hodnotu NULL

Následující příklad ukazuje, jak vložit NULL. Pokud je NULLhodnota FILESTREAM , databázový stroj nevytvoří soubor v systému souborů.

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

Vložení záznamu nulové délky

Následující příklad ukazuje, jak použít INSERT k vytvoření záznamu nulové délky. To je užitečné, když chcete získat popisovač souboru, ale budete s ním manipulovat pomocí rozhraní Win32 API.

INSERT INTO Archive.dbo.Records
    VALUES (NEWID(), 2, 
      CAST ('' AS VARBINARY(MAX)));
GO

Vytvoření datového souboru

Následující příklad ukazuje, jak použít INSERT k vytvoření souboru, který obsahuje data. Databázový stroj převede řetězec Seismic Data na varbinary(max) hodnotu. FileSTREAM vytvoří soubor Systému Windows, pokud ještě neexistuje. Data se pak přidají do datového souboru.

INSERT INTO Archive.dbo.Records
    VALUES (NEWID(), 3, 
      CAST ('Seismic Data' AS VARBINARY(MAX)));
GO

Když vyberete všechna data z Archive.dbo.Records tabulky, výsledky se podobají výsledkům zobrazeným v následující tabulce. Id Sloupec ale bude obsahovat jiné identifikátory GUID.

ID Sériové číslo Graf
C871B90F-D25E-47B3-A560-7CC0CA405DAC 1 NULL
F8F5C314-0559-4927-8FA9-1535EE0BDF50 2 0x
7F680840-B7A4-45D4-8CD5-527C44D35B3F 3 0x536569736D69632044617461

Aktualizace dat FILESTREAM

Data v systému souborů můžete aktualizovat pomocí Transact-SQL, ale při streamování velkých objemů dat do souboru možná nebudete chtít.

Následující příklad nahradí veškerý text v záznamu souboru textem Xray 1.

UPDATE Archive.dbo.Records
SET [Chart] = CAST('Xray 1' AS VARBINARY(MAX))
WHERE [SerialNumber] = 2;

Odstranění dat FILESTREAM

Když odstraníte řádek obsahující pole FILESTREAM, odstraníte také jeho základní soubory systému souborů. Jediným způsobem, jak odstranit řádek, a proto soubor, je použít příkaz Transact-SQL DELETE .

Následující příklad ukazuje, jak odstranit řádek a jeho přidružené soubory systému souborů.

DELETE Archive.dbo.Records
WHERE SerialNumber = 1;
GO

Když vyberete všechna data z Archive.dbo.Records tabulky, řádek zmizí a přidružený soubor už nebudete moct používat.

Poznámka:

Podkladové soubory jsou odstraněny modulem pro uvolňování nevyužívaných dat FILESTREAM.

Kontrola, jestli tabulka nebo databáze obsahuje data FILESTREAM

Pokud chcete zjistit, jestli databáze nebo tabulka obsahuje data FILESTREAM, musíte se dotazovat na systémová zobrazení.

Následující rozšířený příklad ukazuje postup vytvoření nové databáze, vytvoření tabulek, které mají data FILESTREAM, a zobrazení systému dotazů, abyste viděli, zda tabulky a samotná databáze obsahují data 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';