- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近才开始使用 OPENROWSET
将图像插入到表格中。以前,我会指定每个图像的路径(1 个图像 = 1 个 INSERT
语句),并使用 PHP 生成图像的二进制字符串:
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
VALUES (
(
SELECT *
FROM OPENROWSET(BULK '" . $this->image['path'] . "', SINGLE_BLOB) AS Binary
),
'" . $this->image['mime_type'] . "',
'" . $this->image['seo_filename'] . "',
'" . $this->image['alt'] . "',
'',
0
)
但是,我试图通过单个查询插入所有图像。所以,我已经开始将每个图像的路径存储到一个表中,现在我需要像以前一样插入每个图像(只需使用表的路径字段而不是 PHP 字符串)。但是,当我尝试以下操作时:
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
SELECT
(
SELECT *
FROM OPENROWSET(BULK ImagePath, SINGLE_BLOB) AS Binary
),
MimeType,
Name,
Alt,
'',
0
FROM nopRMS..Product_Image_Mappings
我收到以下错误:
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'ImagePath'.
因此,我尝试在列名称周围添加引号(无济于事):
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
SELECT
(
SELECT *
FROM OPENROWSET(BULK 'ImagePath', SINGLE_BLOB) AS Binary
),
MimeType,
Name,
Alt,
'',
0
FROM nopRMS..Product_Image_Mappings
Msg 4860, Level 16, State 1, Line 1
Cannot bulk load. The file "ImagePath" does not exist.
必须有一种方法来实现这一点,我只是无法在任何地方在线找到合适的语法。有谁知道如何告诉 SQL Server 从 dbo.Product_Image_Mappings.ImagePath
获取路径(字符串)?
更新
我忘了给你一个 dbo.Product_Image_Mappings.ImagePath
会返回的值的例子。它的路径类似于 \\DEREK\WebImages\1\ca-82300.jpg
...
更新
Eirikur Eiriksson 似乎在 this thread 中提供了解决方案,但这看起来像是实现相同目的的过于复杂的方法...
更新(尝试使用 Eirikur Eiriksson 的方法)
DECLARE @SQL_STR NVARCHAR(MAX) = N'';
SELECT @SQL_STR = STUFF(
(
SELECT
N'
UNION ALL
SELECT '
+ N'(SELECT X.BulkColumn FROM OPENROWSET(BULK '
+ NCHAR(39) + im.ImagePath + NCHAR(39)
+ N', SINGLE_BLOB) AS X) AS PictureBinary,'
+ NCHAR(39) + im.MimeType + NCHAR(39)
+ N' AS MimeType,'
+ NCHAR(39) + im.Name + NCHAR(39)
+ N' AS SeoFilename,'
+ NCHAR(39) + REPLACE(im.Alt, '''', '''''') + NCHAR(39)
+ N' AS AltAttribute,'
+ N'NULL AS TitleAttribute,'
+ N'0 AS IsNew'
FROM nopRMS..Product_Image_Mappings im
FOR XML PATH(''), TYPE
).value('.[1]','NVARCHAR(MAX)'),1,12,N''
)
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
EXEC (@SQL_STR);
这有点管用,但它只插入了 42 行(超过 7200 行)...我需要它 100% 准确 :( 不过我承认,我可能需要更改此查询的某些内容,但我不对此一无所知(除了基本的 INSERT、SELECT 等)
最佳答案
也许不使用OPENROWSET
?您可以使用 SQLCLR 以更简单、更清晰的方式处理您想要的内容。您可以创建标量 UDF 以仅读取文件的内容并将其作为 VARBINARY(MAX)
返回。然后它将很好地适合您现有的查询。例如:
INSERT INTO nopCommerce.dbo.Picture (PictureBinary, MimeType, SeoFilename,
AltAttribute, TitleAttribute, IsNew)
SELECT
dbo.GetBinaryFile([ImagePath]) AS [PictureBinary],
MimeType,
Name,
Alt,
'',
0
FROM nopRMS.dbo.Product_Image_Mappings;
dbo.GetBinaryFile()
需要多少代码?在这里:
using System;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
[return:SqlFacet(MaxSize = -1)]
[SqlFunction(IsDeterministic = false, IsPrecise = true)]
public static SqlBytes GetBinaryFile([SqlFacet(MaxSize = 1000)] SqlString FilePath)
{
if (FilePath.Value.Trim().Equals(String.Empty))
{
return SqlBytes.Null;
}
return new SqlBytes(File.ReadAllBytes(FilePath.Value));
}
T-SQL 包装器对象如下(请注意 WITH RETURNS NULL ON NULL INPUT
行,因为如果 NULL
被传入,它会跳过执行,因此没有需要在 C# 代码中检查 FilePath.IsNull
:-)
CREATE FUNCTION [dbo].[GetBinaryFile](@FilePath NVARCHAR(1000))
RETURNS VARBINARY(MAX)
WITH RETURNS NULL ON NULL INPUT
AS
EXTERNAL NAME [CSVParser].[CSVUtils].[GetBinaryFile];
程序集需要标记为 WITH PERMISSION_SET = EXTERNAL_ACCESS
。许多人通过将 TRUSTWORTHY
的数据库属性设置为 ON
来实现这一点,但这是一种安全风险,甚至没有必要。只需执行以下操作,您就可以将程序集设置为 EXTERNAL_ACCESS
,同时将 TRUSTWORTHY
设置为 OFF
:
master
中创建一个非对称 key 。master
中)。EXTERNAL ACCESS ASSEMBLY
权限。您可以在我撰写的以下文章中找到有关如何在 Visual Studio/SSDT(SQL Server 数据工具)中执行此操作的详细说明:Stairway to SQLCLR Level 7: Development and Security (该站点确实需要免费注册才能查看内容)。
此外,对于不想为创建/部署程序集而烦恼的任何人,SQL# 的完整版中提供了类似的功能(尽管不是免费的)。库(我创建的,虽然许多功能是免费的,但 File_* 文件系统功能仅在完整版中提供)。
关于sql-server - 如何将存储在表中的路径与 OPENROWSET 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629691/
我尝试查询在其他服务器中组合 3 个表的结果。我的查询正在运行,但需要很长时间才能获得结果(2 分钟)。任何人都可以帮助我重组查询以使其快速。我不能为此使用链接服务器。以下是我的查询: DECLARE
使用 SQL Server 2016。 我正在尝试使用 OPENROWSET 读取 Excel 文件。这完美地工作: SELECT * FROM OPENROWSET('Microsoft.ACE.O
我想构造与 OPENROWSET 方法一起使用的查询。 例子: SELECT * FROM OPENROWSET ('SQLOLEDB', 'srv'; 'login'; 'mdp'; 'SELECT
我们可以写这样的查询吗 INSER TNTO Customers SELECT * FROM OPENROWSET( 'SQLNCLI', Remote Server Settings , 'SELE
我正在使用以下命令将数据加载到 SQL Server 中: INSERT INTO [NewTable] SELECT * FROM OPENROWSET ( 'MSDASQL', 'Driver={
我正在尝试导入具有数字和字母数字值的列(来自 .csv 文件),但是当我运行 openrowset 过程时,它会正确导入数字行,但对于字母数字值,它默认为 null. A 表 ID,A,B,C 1,1
我正在浏览 azure 文档并遇到以下短语 OPENROWSET function in Synapse SQL reads the content of the file(s)from a data
我正在尝试在 SQL Openrowset 命令中使用变量文件路径。我知道它无法显式接受变量,并且我需要使用动态 SQL。 目前有效的方法 - SELECT @file_stream = CAST(b
我试图将变量传递到 OPENROWSET 中的 SELECT 语句中,但我不断收到错误 DECLARE @dDateTIME DATE SET @dDateTIME = (SELECT SalesDa
我在执行此查询时遇到问题: SELECT * FROM OPENROWSET( 'SQLNCLI', 'DRIVER={SQL Server};', 'EXEC dbo.sPr
使用方法 OpenRowSet 将数据插入空白文件? 我需要从数据库中插入一个 txt 文件(比如 D:\TDB)一些选择输出(比如 select * from sys.tables) INSERT
我正在转换 EXCEL 文件中包含的一些数据,我正在使用 OPENROWSET 来执行此操作。我可以通过 select * 获取数据类型语法,但我没有在结果中返回任何列名。 在这种情况下,结果是我想使
我花了一整天的时间试图解决这个问题,并准备好寻求帮助。 我正在尝试让以下代码正常工作。 (由于显而易见的原因,用户和通行证被省略)我正在从 SSMS 运行查询,并希望获取存储过程的内容并将其放入临时表
有没有办法在 SQL Server 2008 R2 中使用 OpenRowSet 和 OpenDataSet 命令而无需具有系统管理员权限? 我正在尝试从 Excel 文件加载数据,而我们执行实际加载
我最近才开始使用 OPENROWSET 将图像插入到表格中。以前,我会指定每个图像的路径(1 个图像 = 1 个 INSERT 语句),并使用 PHP 生成图像的二进制字符串: INSERT INTO
我有这个查询,我想做的是从另一台服务器执行存储过程来获取结果。 我需要在 sp 中传递一个参数。 我的问题是它不起作用,我不知道我必须做什么才能让它发挥作用。 希望有人能帮我解决这个问题。 这是我的代
目标 使用 OPENROWSET 功能在针对文本文件的查询中加入数据。 错误 利用 @gbn 在 this question 上的回答,我正在尝试像 OP 一样打开一个行集;虽然文件的格式有点不同。但
我想执行简单的语句: SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;Database=C:\Temp\;','SELECT * FR
我正在尝试运行以下语句: INSERT INTO table SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Dat
是否有计划支持专用池的开放行集?优点: 比外部文件格式更多(更快)的解析器选项,例如行分隔符 可以自动推断模式 直接定义文件格式更方便 最佳答案 这是一个很棒的功能请求,安德斯。我看到您已经创建了一个
我是一名优秀的程序员,十分优秀!