小能豆

MS SQL 链接服务器操作sqlite,无法执行INSERT语句

javascript

执行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]”


阅读 41

收藏
2024-06-21

共1个答案

小能豆

在 SQL Server 中,使用 OPENQUERY 执行 INSERT 操作时遇到的问题通常与 OLE DB 提供程序的限制有关。特别是对于 ODBC 数据源(在这种情况下是 MSDASQL 提供程序),这些操作可能会受到限制。

错误消息表明 MSDASQL 提供程序不支持基于查询的插入或更新操作,尤其是对 BLOB 值的处理。因此,你可能需要尝试其他方法来进行插入操作。以下是一些可能的解决方案:

1. 直接使用四部分名称

如果链接服务器配置正确,你可以尝试直接使用四部分名称进行插入操作,而不是通过 OPENQUERY。格式如下:

INSERT INTO BK...s_category_info (name)
VALUES ('李四');

2. 使用动态SQL

你可以使用动态SQL来构建和执行插入语句。以下是一个示例:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'INSERT INTO s_category_info (name) VALUES (''李四'')';

EXEC (@sql) AT BK;

3. 使用存储过程

在目标服务器上创建一个存储过程,然后通过链接服务器调用该存储过程来执行插入操作。

目标服务器上的存储过程:

CREATE PROCEDURE InsertCategoryInfo
    @name NVARCHAR(100)
AS
BEGIN
    INSERT INTO s_category_info (name)
    VALUES (@name);
END

在源服务器上调用存储过程:

EXEC BK.dbname.dbo.InsertCategoryInfo @name = N'李四';

4. 使用 SSIS 或其他 ETL 工具

如果上述方法都不可行,可以考虑使用 SQL Server Integration Services (SSIS) 或其他 ETL 工具进行数据插入。SSIS 具有处理数据传输的强大功能,可以处理复杂的数据导入任务。

这些方法中的某一种应该能够帮助你绕过 MSDASQL 提供程序的限制,并成功地将数据插入到目标表中。选择最适合你环境的方法,并进行测试以确保其正确性和有效性。

2024-06-21