使用OPENROWSET批量插入Filestream文件遇错误码50请求不支持求助
问题原因与解决方案
核心原因
你遇到的错误是因为Filestream的共享路径并非标准Windows文件共享,它是SQL Server专属管理的特殊共享,操作系统层面不支持OPENROWSET(BULK)这类直接访问文件系统的操作去读取该路径下的文件,所以会抛出"请求不支持"的错误。
可行解决方案
方案1:直接从Filestream表读取数据(推荐)
既然文件已经存储在Filestream容器中,不需要绕路用OPENROWSET,直接通过SQL查询读取Filestream列的内容即可插入到目标表。假设你的Filestream存储表名为tblFilestreamStore,包含FileName(存储文件名)和FileStreamData(Filestream类型列),可以用以下语句:
INSERT INTO tblXmlFiles(IdTache, idSuiviTrt, XMLFileName, XMLData) SELECT 0, 0, FileName, CONVERT(XML, FileStreamData) FROM tblFilestreamStore WHERE FileName = 'Test1.xml';
方案2:复制文件到普通路径后再导入
如果必须使用OPENROWSET,可以先把Filestream路径下的文件复制到本地临时目录或者普通Windows共享路径,再执行导入操作:
- 复制文件(使用
xp_cmdshell,需要先启用该功能):
-- 先启用xp_cmdshell(如果未启用) EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; -- 复制Filestream文件到本地临时路径 EXEC xp_cmdshell 'COPY "\\OMEGA\XMLFiles\XMLFiles\XMLFiles\Test1.xml" "C:\SQLTemp\Test1.xml"';
- 执行原导入语句指向临时文件:
INSERT INTO tblXmlFiles(IdTache, idSuiviTrt, XMLFileName, XMLData) SELECT 0, 0, '\OMEGA\XMLFiles\XMLFiles\XMLFiles\Test1.xml', CONVERT(XML, BulkColumn) FROM OPENROWSET(BULK 'C:\SQLTemp\Test1.xml', SINGLE_BLOB) AS x;
- 清理临时文件:
EXEC xp_cmdshell 'DEL "C:\SQLTemp\Test1.xml"';
关于权限的补充说明
Filestream的权限完全由SQL Server控制,不存在Windows共享权限设置选项,所以你找不到权限选项卡是正常的。要访问Filestream数据,只需确保执行查询的SQL账号拥有对应Filestream表的SELECT权限即可,无需设置Windows层面的共享权限。
内容的提问来源于stack exchange,提问作者rvunen
相关产品推荐
相关产品推荐

