如何将任何文件存储到 SQL 数据库






4.67/5 (40投票s)
一种将任何文件存储到 SQL 数据库的简单技术。
引言
本文档只是一个简单的示例,用于将任何文件格式存储到 SQL Server 数据库中。
背景
最近我完成了一个项目,需要存储各种文件,例如 Microsoft Office 文件格式、PDF、图像等。当我开始编写代码时,我编写了一个函数来存储二进制数据,然后我想到为什么不使用从存储过程直接批量插入。
Using the Code
我将讨论您可以通过以下简单的存储过程直接将二进制数据存储到 SQL 表中的方法
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Author,,Md. Marufuzzaman
-- Create date: 
-- Description:	Description,, Insert the Binary data 
-- =============================================
-- EXEC dbo.spStoreBinaryFiles 'C:\eFaxFiles\eFaxPromo.pdf;D:\eFaxFiles\eFaxPromo.pdf;'
CREATE PROCEDURE [dbo].[spStoreBinaryFiles]
 @FILE_PATH	VARCHAR(MAX)
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @FILE_LENGTH  BIGINT
	DECLARE @FILE_DATA    VARBINARY(MAX)
	DECLARE @FILE_NAME	  VARCHAR(100)
	DECLARE @DOCUMENT_NAME VARCHAR(100) 
	DECLARE @DOCUMENT_NATURE VARCHAR(5)  
	DECLARE @VAL1 VARCHAR(100)
	DECLARE @VAL2 VARCHAR(100)
DECLARE curDOCUMENTS CURSOR FOR SELECT *  FROM dbo.SPLIT ( ';', @FILE_PATH )
OPEN curDOCUMENTS
FETCH NEXT FROM curDOCUMENTS 
INTO @VAL1,@VAL2
WHILE @@FETCH_STATUS = 0
BEGIN
	IF OBJECT_ID('#ORStable') IS NULL 
		BEGIN
			CREATE TABLE #ORStable _
				(Length BIGINT, vDocument VARBINARY(MAX))
			
			DECLARE @SQL_QUERY	  NVARCHAR(1000)
			SET @SQL_QUERY= '
			INSERT INTO #ORStable
			SELECT len(bulkcolumn), *
			FROM OPENROWSET(BULK '''+@VAL2+''', _
					SINGLE_BLOB) AS BinaryData'
			exec SP_executesql @SQL_QUERY
 
		END
	
		EXEC dbo.spGetDocumentNature @VAL2, @DOCUMENT_NATURE  OUTPUT
		EXEC dbo.spGetDocumentName @VAL2, @DOCUMENT_NAME  OUTPUT
        
      SELECT TOP 1 @FILE_LENGTH = Length, @FILE_DATA = vDocument FROM #ORStable
	  INSERT INTO dbo.tblBinaryFiles
			(
				 [File]
				,[Path]	
				,[Ext]
				,[Size]
				,[Binary]
			)
	  VALUES(
				 @DOCUMENT_NAME
				,@VAL2
				,@DOCUMENT_NATURE
				,@FILE_LENGTH
				,@FILE_DATA
			)
     
     DROP TABLE dbo.#ORStable
    FETCH NEXT FROM curDOCUMENTS 
    INTO @VAL1,@VAL2
END
CLOSE curDOCUMENTS
DEALLOCATE curDOCUMENTS 
END
OPENROWSET:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。此方法是访问链接服务器的一种替代方法,是一种一次性的、临时连接和访问远程数据的方式,使用 OLE DB。OPENROWSET 函数可以在查询的 FROM 子句中引用,就像它是一个表名一样。OPENROWSET 函数也可以引用为 INSERT、UPDATE 或 DELETE 语句的目标表,这取决于 OLE DB 提供程序的功能。虽然查询可以返回多个结果集,但 OPENROWSET 仅返回第一个结果集。
大型二进制对象 (BLOB):BLOB 数据类型用于存储程序可以生成的数据:图形图像、卫星图像、视频片段、音频片段等。
BulkColumn:查询中引用的 BulkColumn 代表要插入的 varbinary 值。
示例批量插入 SQL 语句
			DECLARE @SQL_QUERY	  NVARCHAR(1000)
			SET @SQL_QUERY= '
			INSERT INTO #ORStable
			SELECT len(bulkcolumn), *
			FROM OPENROWSET(BULK '''+@VAL2+''', _
					SINGLE_BLOB) AS BinaryData'
			exec SP_executesql @SQL_QUERY
--Here variable VAL2 contains the single file path information.
--Example VAL2 = "\\192.168.1.1\myFiles\myFile.pdf"
--        VAL2 = "C:\myFiles\myFile.pdf" 
我编写了一些其他的 存储过程 来获取文件名、文件性质以及用于拆分文件路径的函数。我没有包含这段代码,因为我不想偏离本文档的主要目标。我希望这对您有所帮助。祝您使用愉快。
关注点
如果您使用任何网络路径,请确认您的 SQL 登录用户被允许在操作系统上执行批量加载。


