如何将任何文件存储到 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 登录用户被允许在操作系统上执行批量加载。