如何将文件表与SQL Server中的现有表链接

时间:2017-11-25 04:27:49

标签: sql .net sql-server-2012

我要求在数据库中保存员工形象。我被要求使用文件表。在谷歌搜索后,我得到了一些关于如何开始使用文件表的好内容。我设法创建它们,同样向这些表插入数据就像复制/粘贴到指定文件夹一样简单,数据也会插入到表中。问题是如何将每个员工行集与其各自的图像Sample row data from the Filetable

相关联

整体流程将像员工将通过前端上传他/她的图像或文档,这将保存服务器上的图像。问题是如何添加员工的参考与其各自的形象。一个选项可以是在employee表中有一个FileName列,它引用FileTable中的name列,但我需要一些更有效的方法,例如关联id。任何其他实现这一目标的方式将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先,由于文件表是从SQLSERVER 2012开始引入的新功能,因此耗费了大量时间来完成任务。其次,这是我采取的解决问题的方法。我将提供一些有用的链接,以使其他开发人员的生活更轻松。希望它有所帮助。

文件表几乎与普通的SQL表类似,但是有一些配置可以启动它,因为它位于数据库的单独部分,在表 - > FIleTables中。由于表结构是预定义的,因此无法更改表模式。所以我采用的方法是引用stream_id作为引用键来链接我想要使用的表,并通过存储过程处理约束逻辑。在我的场景中,Employee表将有一个stream_id列,它将通过stream_id链接到File表,也使File表中的行唯一,我插入了Employee Id作为存储图像的名称,而不是实际的名称文件。即使有人试图通过复制/粘贴直接插入文件,它也与Employee表没有任何关系,你也可以提供访问权限以获得所需的权限。查看链接以获取更多详细信息。就是这样,通过一些调整,我能够解决我的问题。 下面的SQL脚本将有助于一次性激活实例级别的文件流。

EXEC sp_configure filestream_access_level, 2
RECONFIGURE
GO

--For new DB
CREATE DATABASE <DATABASE name>
WITH FILESTREAM
( 
NON_TRANSACTED_ACCESS = FULL,
DIRECTORY_NAME = N'<DIRECTORY name>'
);
GO

--If you have an existing DB
ALTER DATABASE <DATABASE name>
ADD FILEGROUP <File group name> 
CONTAINS FILESTREAM
GO

ALTER DATABASE <DATABASE name>
ADD FILE (NAME='<File group name>', FILENAME='<DIRECTORY name>')
TO FILEGROUP <File group name>
GO

ALTER DATABASE <DATABASE name>
SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'<File 
group name>')
GO

use <DATABASE name>
GO
CREATE TABLE <Filetable NAME> AS FileTable;
GO

还有一些非常有用的链接:

https://www.mssqltips.com/sqlservertip/2667/filetable-feature-in-sql-server-2012/

http://sql-articles.com/articles/general/working-with-filetables/

https://michaelfirsov.wordpress.com/working-with-sql-server-file-tables-part-1/

https://michaelfirsov.wordpress.com/working-with-sql-server-file-tables-part-2/

https://msdn.microsoft.com/pl-pl/library/gg492084(v=sql.110).aspx

感谢。

答案 1 :(得分:0)

在雇主和文件表之间不仅仅具有一个“联接(多对多)表”是否一样容易吗?您不必将其用作多对多表。将其命名为EmployeeImages并添加描述属性/属性,即“雇用照片”,“刚刚被解雇的照片”。与雇员和文件表的主键。简单!