执行openquery查询正常访问数据。 Select * from openquery(BK , ‘select name,sequence,add_time,last_time,disabled,is_sync from s_category_info’) 执行insert 语句报错 INSERT OPENQUERY (BK, ‘SELECT name FROM s_category_info ‘) VALUES (‘李四’) 链接服务器”BK”的 OLE DB 访问接口 “MSDASQL” 返回了消息 “不支持对 BLOB 值执行基于查询的插入或更新操作。”。 消息 7343,级别 16,状态 2,第 15 行 链接服务器 “BK” 的 OLE DB 访问接口 “MSDASQL” 无法 INSERT INTO 表 “[MSDASQL]”
在 SQL Server 中,使用 OPENQUERY 执行 INSERT 操作时遇到的问题通常与 OLE DB 提供程序的限制有关。特别是对于 ODBC 数据源(在这种情况下是 MSDASQL 提供程序),这些操作可能会受到限制。
OPENQUERY
INSERT
MSDASQL
错误消息表明 MSDASQL 提供程序不支持基于查询的插入或更新操作,尤其是对 BLOB 值的处理。因此,你可能需要尝试其他方法来进行插入操作。以下是一些可能的解决方案:
如果链接服务器配置正确,你可以尝试直接使用四部分名称进行插入操作,而不是通过 OPENQUERY。格式如下:
INSERT INTO BK...s_category_info (name) VALUES ('李四');
你可以使用动态SQL来构建和执行插入语句。以下是一个示例:
DECLARE @sql NVARCHAR(MAX); SET @sql = N'INSERT INTO s_category_info (name) VALUES (''李四'')'; EXEC (@sql) AT BK;
在目标服务器上创建一个存储过程,然后通过链接服务器调用该存储过程来执行插入操作。
目标服务器上的存储过程:
CREATE PROCEDURE InsertCategoryInfo @name NVARCHAR(100) AS BEGIN INSERT INTO s_category_info (name) VALUES (@name); END
在源服务器上调用存储过程:
EXEC BK.dbname.dbo.InsertCategoryInfo @name = N'李四';
如果上述方法都不可行,可以考虑使用 SQL Server Integration Services (SSIS) 或其他 ETL 工具进行数据插入。SSIS 具有处理数据传输的强大功能,可以处理复杂的数据导入任务。
这些方法中的某一种应该能够帮助你绕过 MSDASQL 提供程序的限制,并成功地将数据插入到目标表中。选择最适合你环境的方法,并进行测试以确保其正确性和有效性。