Получить FileTable stream_id после создания изображения с помощью File I / O Api - PullRequest
3 голосов
/ 08 июня 2019

Я попытался вставить файл изображения в каталог FileTable SQL Server с помощью API ввода-вывода. Мне нужно получить stream_id вставленного изображения и использовать его в качестве другой таблицы в качестве внешнего ключа.

Может ли кто-нибудь помочь мне, как я могу получить созданное изображение stream_id?

1 Ответ

3 голосов
/ 08 июня 2019

После создания файла вам нужно будет запросить таблицу файлов, используя T-SQL с только что созданным путем к файлу, чтобы получить stream_id.Лучше всего это сделать с использованием уникальной таблицы файлов path_locator столбца.

Ниже приведены примеры хранимых процедур и примеры использования, которые получают уникальный stream_id файла с использованием относительного или полного UNC-пути.path_locator файловых таблиц имеет уникальный индекс ограничений, поэтому эти запросы очень эффективны.

CREATE DATABASE FileTableExample
    ON  PRIMARY 
    ( NAME = N'FileTableExample', FILENAME = N'D:\SqlFiles\FileTableExample.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10MB ), 
     FILEGROUP FileStreamFG CONTAINS FILESTREAM  DEFAULT
    ( NAME = N'FileTableExample_FileStream', FILENAME = N'D:\SqlFiles\FileTableExample_FileStreamFG' , MAXSIZE = UNLIMITED) 
     LOG ON 
    ( NAME = N'FileTableExample_log', FILENAME = N'D:\SqlFiles\FileTableExample_log.ldf' , SIZE = 10MB , MAXSIZE = UNLIMITED, FILEGROWTH = 10MB );
GO

ALTER DATABASE FileTableExample SET FILESTREAM( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileTableExample' ) 
GO

USE FileTableExample;
GO

CREATE TABLE [dbo].[Images] AS FILETABLE ON [PRIMARY] FILESTREAM_ON [FileStreamFG];
WITH
(
    FILETABLE_DIRECTORY = N'Images', FILETABLE_COLLATE_FILENAME = SQL_Latin1_General_CP1_CI_AS
);
GO

CREATE PROC dbo.GetStreamIDByRelativePath
    @RelativeFilePath nvarchar(MAX)
AS
SELECT stream_id
FROM dbo.Images
WHERE path_locator = GetPathLocator(FileTableRootPath() + @RelativeFilePath);
GO

EXEC dbo.GetStreamIDByRelativePath @RelativeFilePath = N'\Images\YourImageFile.png';
GO

CREATE PROC dbo.GetStreamIDByFullUNCPath
    @FullUNCPath nvarchar(MAX)
AS
SELECT stream_id
FROM dbo.Images
WHERE path_locator = GetPathLocator(@FullUNCPath);
GO

EXEC dbo.GetStreamIDByFullUNCPath @FullUNCPath = N'\\YourSqlServer\YourFileStreamShare\YourDatabaseFileSteamDirectory\Images\YourImageFile.png';
GO
...