在作业中执行远程连接时,需要对本次作业执行的步骤指定特定用户

并且该用户必须拥有所需操作数据库的db_owner角色,和服务器sysadmin角色

在作业中执行远程连接时,需要做登录映射

下面是我在作业中执行的sql脚本

/* 获取大容量访问权限,在执行作业时需先执行这句话
ALTER DATABASE TEMP SET TRUSTWORTHY ON
GO
*/
--这句话在执行作业时必须加
SET QUOTED_IDENTIFIER ON
GO
/* 每月一号一点获取数据 */
insert into [dbo].[T_EntryLog] values(CONVERT(varchar(30), GETDATE(), 121),
'发生时间:' + CONVERT(varchar(30), GETDATE(), 121) + char(10) +
'自定义信息:' + '开始执行远程调取,读取文件【C:\inter.xml】。' ); DECLARE @doc XML, --xml文件名称
@sqls nvarchar(max), --要执行的sql语句
@mtablelink varchar(500), --本地数据库表全名
@thisdate varchar(500) = CONVERT(varchar(6),dateadd(MM,-1,getdate()), 112), --上一月份
@tablelink varchar(500) --接口表全名
SELECT @doc=BulkColumn FROM OPENROWSET(BULK 'C:\inter.xml' ,SINGLE_BLOB ) AS x; select @mtablelink = t.c.value('(text())[1]','VARCHAR(500)')
from @doc.nodes('/db/mlink') as t(c);
select @tablelink = t.c.value('(text())[1]','VARCHAR(500)')
from @doc.nodes('/db/link') as t(c);
declare @column_str varchar(500) = '', --拼接列sql语句
@mixcolumn_str varchar(500) = '', --拼接混合列sql语句
@cuttime_str varchar(500) = '', --拼接his数据时间筛选sql语句
@servername varchar(100), --连接名称
@tablename varchar(100) --表名称
select @servername = SUBSTRING(@tablelink,0,CHARINDEX('.', @tablelink, 1))
, @tablename = SUBSTRING(@tablelink,CHARINDEX('.', @tablelink, 1)+1,LEN(@tablelink));
select @column_str += stuff((
select (case
when t.c.value('(@yName)[1]','VARCHAR(500)') = ''
then ''
when t.c.value('(@yName)[1]','VARCHAR(500)') !=''
then ',' + t.c.value('(@yName)[1]','VARCHAR(500)')
end)
from @doc.nodes('/db/columns/column') as t(c) for xml path('') ),1,1,'');
--print @column_str
select @mixcolumn_str += stuff((
select ',' + (case
when t.c.value('(@yName)[1]','VARCHAR(500)') = ''
then 'CONVERT(varchar(30), GETDATE(), 121)'
when t.c.value('(@yName)[1]','VARCHAR(500)') !=''
then t.c.value('(@yName)[1]','VARCHAR(500)')
end) + ' as ' + t.c.value('(@mName)[1]','VARCHAR(500)')
from @doc.nodes('/db/columns/column') as t(c) for xml path('') ),1,1,'');
--print @mixcolumn_str select @cuttime_str = t.c.value('(@yName)[1]','VARCHAR(500)')
from @doc.nodes('/db/columns/cuttime[1]') as t(c); /*-------删除临时表--------*/
begin try
exec('drop table ##temptable;')
end try
begin catch
end catch begin try
begin tran if @doc.exist('/db[@type="MSSQL"]') = 1
begin
/*-----------------MSSQL--------------------*/
--print 'MSSQL'; exec(
/*-------将远程数据导入临时表--------*/
' select ' + @mixcolumn_str + ' into ##temptable FROM OPENQUERY( ' + @servername + ',''SELECT ' + @column_str + ' from ' + @tablename +
' where CONVERT(varchar(6), CONVERT(datetime,' + @cuttime_str + ',101), 112) = ''''' + @thisdate + ''''' ' + @clean_str + ' '');' +
/*-------将临时表数据导入本地表-------- */
' insert into ' + @mtablelink + ' select * from ##temptable;') end
else if @doc.exist('/db[@type="ORACLE"]') = 1
begin
/*-----------------ORACLE--------------------*/
--print 'ORACLE'; exec(
/*-------将远程数据导入临时表--------*/
' select ' + @mixcolumn_str + ' into ##temptable FROM OPENQUERY( ' + @servername + ',''SELECT ' + @column_str + ' from ' + @tablename +
' where to_char(' + @cuttime_str + ',''''yyyyMM'''') = ''''' + @thisdate + ''''' ' + @clean_str + ' '');' +
/*-------将临时表数据导入本地表-------- */
' insert into ' + @mtablelink + ' select * from ##temptable;') end
else if @doc.exist('/db[@type="MYSQL"]') = 1
begin
/*-----------------MYSQL--------------------*/
--print 'MYSQL'; exec(
/*-------将远程数据导入临时表--------*/
' select ' + @mixcolumn_str + ' into ##temptable FROM OPENQUERY( ' + @servername + ',''SELECT ' + @column_str + ' from ' + @tablename +
' where DATE_FORMAT(' + @cuttime_str + ',''''%Y%m'''') = ''''' + @thisdate + ''''' ' + @clean_str + ' '');' +
/*-------将临时表数据导入本地表-------- */
' insert into ' + @mtablelink + ' select * from ##temptable;') end commit tran
end try
begin catch
rollback tran
insert into [dbo].[T_EntryLog] values(CONVERT(varchar(30), GETDATE(), 121),
'发生时间:' + CONVERT(varchar(30), GETDATE(), 121) + char(10) +
'错误状态号:' + cast(ERROR_STATE() as varchar(20)) + char(10) +
'严重性:' + cast(ERROR_SEVERITY() as varchar(20)) + char(10) +
'错误号:' + cast(ERROR_NUMBER() as varchar(20)) + char(10) +
'错误行号:' + cast(ERROR_LINE() as varchar(20)) + char(10) +
'系统错误信息:' + ERROR_MESSAGE() );
end catch insert into [dbo].[T_EntryLog] values(CONVERT(varchar(30), GETDATE(), 121),
'发生时间:' + CONVERT(varchar(30), GETDATE(), 121) + char(10) +
'自定义信息:' + '结束执行远程调取。' ); /*-------删除临时表--------*/
begin try
exec('drop table ##temptable;')
end try
begin catch
end catch

以及我配置的xml文件

<?xml version="1.0" encoding="utf-8" ?>
<db Explain="数据库类型【MSSQL、ORACLE、MYSQL】" type="MSSQL" >
<mlink Explain="我方字表链接全称">TEMP.[dbo].[MYTABLE]</mlink>
<link Explain="对接系统数据库表链接全称">INTER_LINK.[INTERFACEDB].[dbo].[TABLE]</link>
<columns Explain="表字段对照,mName:【我方字段名称(不需要操作)】,yName:【对接系统字段名称】" >
<identity Explain="对接系统数据表过滤主键" yName="" />
<cuttime Explain="对接系统数据截取时间字段,根据该字段过滤对接系统数据当月时间" yName="" /> <column Explain="表字段对照" mName="" yName="" />
<column Explain="创建时间" mName="" yName="" />
<column Explain="导入时间【yName:不需要填写】" mName="" yName="" />
</columns>
</db>

sql server 在作业中 远程连接 oracle mysql sqlserver 数据库的更多相关文章

  1. SQL Server 2005 不允许远程连接解决方法

    刚刚安装的数据库系统,按照默认安装的话,很可能在进行远程连接时报错,通常是错误:“在连接到 SQL Server 2005 时,在默认的设 置下 SQL Server 不允许进行远程连接可能会导致此失 ...

  2. SQL Server 2008 R2 开启远程连接

    因为sql server 2008默认是不允许远程连接的,sa帐户也是默认禁用的,如果想要在本地用SSMS(SQL Server Management Studio Express) 连接远程服务器上 ...

  3. SQL Server 2008设置 开启远程连接

    SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的, 如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 1,SQL Server ...

  4. sql server导出数据,远程连接失败,需要设置权限

    在sql  server management中右键当前连接——>方面 在 服务器配置中 将  RemoteAccessEnabled.RemoteDacEnabled设置为TRUE 安全性—— ...

  5. oracle mysql sqlserver数据库中的分页

    oracle: select * from (select rownum r,t1.* from tablename t1 where rownum <M+N ) t2 where t2.r&g ...

  6. 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连

    在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连 sql server服务器sqlserver远程连接数据库防火墙在建立 ...

  7. PL/SQL Developer 远程连接Oracle数据库

    PL/SQL Developer 远程连接Oracle数据库 网上搜了很多方法,这个可行! 1.    配置服务器tnsnames.ora文件,如果本机上没有安装oracle,可以从安装了oracle ...

  8. sql server 2008 r2 中的oracle发布使用笔记

    sql server 2008 r2 中的oracle发布功能,能够将oracle数据库作为发布服务器,将oracle中的数据自动同步到sql server 数据库中,在新建oracle发布前确保sq ...

  9. SQL Server 2008 R2中配置作业失败后邮件发送通知

    SQL Server日常维护中难免会遇到作业失败的情况.失败后自然需要知道它失败了,除了例行检查可以发现出错以外,有一个较实时的监控还是很有必要的.比较专业的监控系统比如SCOM虽然可以监控作业执行情 ...

随机推荐

  1. PAT 甲级 1032 Sharing

    https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920 To store English words ...

  2. js图片转换为base64

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. SQL 中 Date 与Datetime的区别

    Date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间. DateTime 日 ...

  4. 【数据库】】MySQL之desc查看表结构的详细信息

    在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...

  5. javascript中检测一个变量的类型

    /** * 怎么检测一个变量的类型? * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. * 另外还可以适应jQuery ...

  6. Linq里where出现null的问题

    今天遇到一个问题,怎么在where里判断一个字段是否为null,并且这个字段不是字符串string类型,而是int和GUID类型,折腾了半天终于搞明白了.(由于项目是我半路接手的,问题是前期的同事给我 ...

  7. [SOJ #47]集合并卷积

    题目大意:给你两个多项式$A,B$,求多项式$C$使得:$$C_n=\sum\limits_{x|y=n}A_xB_y$$题解:$FWT$,他可以解决形如$C_n=\sum\limits_{x\opl ...

  8. 122. Best Time to Buy and Sell Stock II (Array)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  9. BZOJ3144:[HNOI2013]切糕——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3144 看着很像网络流,但是费用流貌似无法解决这个问题,其实甚至连忽略d的情况都做不到. 最小割? ...

  10. BZOJ4872:[SHOI2017]分手是祝愿——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4872 https://www.luogu.org/problemnew/show/P3750 Zei ...