SQL server 往MySQL插入数据报错 访问接口 MSDASQL 无法 insert into 表[MSDASQ]

见习水师 2017-05-02 11:45:59


declare @name nvarchar(2000)
select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0

select @name=N'下一年度即将离职人员:'+@name

declare @sql nvarchar(max)
set @sql=N'insert into openquery(msgmysel,''select smid,srcid,mobiles,content from apimtfanry'')
values(0,0,''13500001111'',N'''+@name+''')'

exec(@sql)
...全文
2014 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
bestyou520 2017-06-23
  • 打赏
  • 举报
回复
应该是字符集的问题,我现在也遇到这个问题,只要有中文就不行,数字和英文是没问题的,楼主解决了吗??
见习水师 2017-05-10
  • 打赏
  • 举报
回复
引用 21 楼 KanzakiOrange 的回复:
这里你的语句不应该是 insert into openquery(msgmysel,‘select smid,srcid,mobiles,content from apimtfanry’) select 0,0,'13500001111',@name ?? 这一句能执行成功。先不要直接套动态语句嘛……调通了固定语句才好找问题
不用动态的试过的,也是不行的。算了以后在搞吧。先看看能不能用其他的接口方式做。
见习水师 2017-05-04
  • 打赏
  • 举报
回复
引用 16 楼 zhujinqiang 的回复:
只要插入的是字符型数据就会报这个错。。。 检查mysql服务器使用的字符集
MySQL用的是utf8
见习水师 2017-05-04
  • 打赏
  • 举报
回复
引用 15 楼 KanzakiOrange 的回复:
如果按照你描述,直接把语句print出来,直接执行有没有问题?在mysql 执行同样语句有没有问题?按照你描述如果是字符型才有问题,看下mysql里面的服务器默认字符集和数据库和表使用的字符集是utf8 还是latin1 的字符集。如果是latin估计不支持中文
declare @name nvarchar(2000)
select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0
  
select @name=N'下一年度即将退休人员:'+@name
  
declare @sql nvarchar(max)
set @sql=N'select * from openquery(msgmysel,
''insert into apimtfanry( smid,srcid,mobiles,content) values(0,0,''''13500001111'''',N'''''+@name+''''')
;select found_rows() as ct '')'
  
 print @sql
 --如何ct值为1,说明插入成功
exec(@sql)
print 出来在 sqlserver执行提示 链接服务器 msgmysql 的ole db 访问接口 MSDASQL 指示该对象没有列或者当前用户没有访问该对象的权限。将insert 语句放到MySQL执行可以成功,MySQL默认字符集是utf8
zhujinqiang 2017-05-04
  • 打赏
  • 举报
回复
只要插入的是字符型数据就会报这个错。。。 检查mysql服务器使用的字符集
Ginnnnnnnn 2017-05-04
  • 打赏
  • 举报
回复
这里你的语句不应该是 insert into openquery(msgmysel,‘select smid,srcid,mobiles,content from apimtfanry’) select 0,0,'13500001111',@name ?? 这一句能执行成功。先不要直接套动态语句嘛……调通了固定语句才好找问题
见习水师 2017-05-04
  • 打赏
  • 举报
回复
引用 19 楼 KanzakiOrange 的回复:
[code=sql]
declare @name nvarchar(2000) select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1 and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2 and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0 select @name=N'下一年度即将退休人员:'+@name declare @sql nvarchar(max) set @sql=N'select * from openquery(msgmysel, ''insert into apimtfanry( smid,srcid,mobiles,content) values(0,0,''''13500001111'''',N'''''+@name+''''') ;select found_rows() as ct '')' print @sql --如何ct值为1,说明插入成功 exec(@sql)[/code] 你这个例子里面有2条语句,是不行的哦。就是会报错,就是最简单的 select 1 AS a; select 2 as B 放在这里一齐执行都是不行的。所以你报这个错误是这里引起。
把 ;select found_rows() as ct 去掉了,但是执行仍然是报相同的错误。。。这同步搞的死的心都有了
Ginnnnnnnn 2017-05-04
  • 打赏
  • 举报
回复
[code=sql]
declare @name nvarchar(2000) select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1 and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2 and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0 select @name=N'下一年度即将退休人员:'+@name declare @sql nvarchar(max) set @sql=N'select * from openquery(msgmysel, ''insert into apimtfanry( smid,srcid,mobiles,content) values(0,0,''''13500001111'''',N'''''+@name+''''') ;select found_rows() as ct '')' print @sql --如何ct值为1,说明插入成功 exec(@sql)[/code] 你这个例子里面有2条语句,是不行的哦。就是会报错,就是最简单的 select 1 AS a; select 2 as B 放在这里一齐执行都是不行的。所以你报这个错误是这里引起。
见习水师 2017-05-03
  • 打赏
  • 举报
回复
引用 13 楼 KanzakiOrange 的回复:
[quote=引用 11 楼 qq_28636895 的回复:] [quote=引用 8 楼 KanzakiOrange 的回复:] 1 测试一下连接的mysql是否正常,比如一个简单的语句能否正常查询 2 检查连接的账号权限是否足够操作mysql
在sqlserver中查询、更新、删除 MySQL中的数据都能成功。另外发现并不是所有的插入都不成功,只有插入的字段涉及到字符型的时候才会有这种报错。链接的账号权限足够的[/quote] 看你的报错,你可以尝试一下如果@name 这个变量值赋值个常量试试,如果没错的话,可以找下是否变量里面的内容引起的[/quote] 改成常量报错相同的
Ginnnnnnnn 2017-05-03
  • 打赏
  • 举报
回复
引用 11 楼 qq_28636895 的回复:
[quote=引用 8 楼 KanzakiOrange 的回复:] 1 测试一下连接的mysql是否正常,比如一个简单的语句能否正常查询 2 检查连接的账号权限是否足够操作mysql
在sqlserver中查询、更新、删除 MySQL中的数据都能成功。另外发现并不是所有的插入都不成功,只有插入的字段涉及到字符型的时候才会有这种报错。链接的账号权限足够的[/quote] 看你的报错,你可以尝试一下如果@name 这个变量值赋值个常量试试,如果没错的话,可以找下是否变量里面的内容引起的
见习水师 2017-05-03
  • 打赏
  • 举报
回复
引用 10 楼 yupeigu 的回复:
但是你这个问题,有可能是由于驱动库的问题导致的。
唉,第一次做这种不同数据库间的数据同步,只要插入的是字符型数据就会报这个错。。。
见习水师 2017-05-03
  • 打赏
  • 举报
回复
引用 8 楼 KanzakiOrange 的回复:
1 测试一下连接的mysql是否正常,比如一个简单的语句能否正常查询 2 检查连接的账号权限是否足够操作mysql
在sqlserver中查询、更新、删除 MySQL中的数据都能成功。另外发现并不是所有的插入都不成功,只有插入的字段涉及到字符型的时候才会有这种报错。链接的账号权限足够的
Ginnnnnnnn 2017-05-03
  • 打赏
  • 举报
回复
如果按照你描述,直接把语句print出来,直接执行有没有问题?在mysql 执行同样语句有没有问题?按照你描述如果是字符型才有问题,看下mysql里面的服务器默认字符集和数据库和表使用的字符集是utf8 还是latin1 的字符集。如果是latin估计不支持中文
LongRui888 2017-05-02
  • 打赏
  • 举报
回复
但是你这个问题,有可能是由于驱动库的问题导致的。
LongRui888 2017-05-02
  • 打赏
  • 举报
回复
引用 7 楼 qq_28636895 的回复:
[quote=引用 6 楼 yupeigu 的回复:] 设置连接服务器属性时,把RPC相关的设置为true试试。 另外,你的代码是否可以改成: exec('insert into xxx...') at msgmysel 按照这个格式改一下
RPC相关设置已经改为 true 依然不成功 提示 链接服务器 msgmysql 的ole db 访问接口 MSDASQL 指示该对象没有列或者当前用户没有访问该对象的权限。 不知道这种格式具体要写成什么样子 exec('insert into xxx...') at msgmysel [/quote] 就是 你可以先拼接语句到变量,然后这样执行: exec(变量) at msgmysel
Ginnnnnnnn 2017-05-02
  • 打赏
  • 举报
回复
1 测试一下连接的mysql是否正常,比如一个简单的语句能否正常查询 2 检查连接的账号权限是否足够操作mysql
见习水师 2017-05-02
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
设置连接服务器属性时,把RPC相关的设置为true试试。 另外,你的代码是否可以改成: exec('insert into xxx...') at msgmysel 按照这个格式改一下
RPC相关设置已经改为 true 依然不成功 提示 链接服务器 msgmysql 的ole db 访问接口 MSDASQL 指示该对象没有列或者当前用户没有访问该对象的权限。 不知道这种格式具体要写成什么样子 exec('insert into xxx...') at msgmysel
LongRui888 2017-05-02
  • 打赏
  • 举报
回复
设置连接服务器属性时,把RPC相关的设置为true试试。 另外,你的代码是否可以改成: exec('insert into xxx...') at msgmysel 按照这个格式改一下
见习水师 2017-05-02
  • 打赏
  • 举报
回复
引用 4 楼 kingtiy 的回复:
[quote=引用 3 楼 kingtiy 的回复:]

declare @name nvarchar(2000)
select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0
 
select @name=N'下一年度即将离职人员:'+@name
 
declare @sql nvarchar(max)
set @sql=N'select * from openquery(msgmysel,
''insert into apimtfanry( smid,srcid,mobiles,content) values(0,0,''''13500001111'''',N'''''+@name+''''')
;select found_rows() as ct '')'
 
 print @sql
 --如何ct值为1,说明插入成功
exec(@sql)
按上面方法试下看看行不?
select row_count()
--用这个代替刚刚发的found_rows
[/quote] 执行的时候提示 链接服务器 msgmysql 的ole db 访问接口 MSDASQL 指示该对象没有列或者当前用户没有访问该对象的权限。
kingtiy 2017-05-02
  • 打赏
  • 举报
回复
引用 3 楼 kingtiy 的回复:

declare @name nvarchar(2000)
select @name=ISNULL(@name+',','')+name from evw_employee e where e.enpstatus=1
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)<2
and ((case when gender=1 then 59 when gender=2 then 49 else 60 end)-e.age)>0
 
select @name=N'下一年度即将离职人员:'+@name
 
declare @sql nvarchar(max)
set @sql=N'select * from openquery(msgmysel,
''insert into apimtfanry( smid,srcid,mobiles,content) values(0,0,''''13500001111'''',N'''''+@name+''''')
;select found_rows() as ct '')'
 
 print @sql
 --如何ct值为1,说明插入成功
exec(@sql)
按上面方法试下看看行不?
select row_count()
--用这个代替刚刚发的found_rows
加载更多回复(3)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧