sql server 在作业中 远程连接 oracle mysql sqlserver 数据库
在作业中执行远程连接时,需要对本次作业执行的步骤指定特定用户
并且该用户必须拥有所需操作数据库的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 数据库的更多相关文章
- SQL Server 2005 不允许远程连接解决方法
刚刚安装的数据库系统,按照默认安装的话,很可能在进行远程连接时报错,通常是错误:“在连接到 SQL Server 2005 时,在默认的设 置下 SQL Server 不允许进行远程连接可能会导致此失 ...
- SQL Server 2008 R2 开启远程连接
因为sql server 2008默认是不允许远程连接的,sa帐户也是默认禁用的,如果想要在本地用SSMS(SQL Server Management Studio Express) 连接远程服务器上 ...
- SQL Server 2008设置 开启远程连接
SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的, 如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 1,SQL Server ...
- sql server导出数据,远程连接失败,需要设置权限
在sql server management中右键当前连接——>方面 在 服务器配置中 将 RemoteAccessEnabled.RemoteDacEnabled设置为TRUE 安全性—— ...
- oracle mysql sqlserver数据库中的分页
oracle: select * from (select rownum r,t1.* from tablename t1 where rownum <M+N ) t2 where t2.r&g ...
- 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连
在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连 sql server服务器sqlserver远程连接数据库防火墙在建立 ...
- PL/SQL Developer 远程连接Oracle数据库
PL/SQL Developer 远程连接Oracle数据库 网上搜了很多方法,这个可行! 1. 配置服务器tnsnames.ora文件,如果本机上没有安装oracle,可以从安装了oracle ...
- sql server 2008 r2 中的oracle发布使用笔记
sql server 2008 r2 中的oracle发布功能,能够将oracle数据库作为发布服务器,将oracle中的数据自动同步到sql server 数据库中,在新建oracle发布前确保sq ...
- SQL Server 2008 R2中配置作业失败后邮件发送通知
SQL Server日常维护中难免会遇到作业失败的情况.失败后自然需要知道它失败了,除了例行检查可以发现出错以外,有一个较实时的监控还是很有必要的.比较专业的监控系统比如SCOM虽然可以监控作业执行情 ...
随机推荐
- 【Linux】- Ubuntu 配置mysql远程访问
ubuntu上安装mysql非常简单只需要几条命令就可以完成. sudo apt-get install mysql-server 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后 ...
- checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同
using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms ...
- 在intelllij中debug的时候使用log4j输出
一般在本地调试的时候,在控制台打印输出都会使用system.out.print,但是在线上运行的时候一般都是使用log4j进行日志输出. 那么在编写代码的时候,又不想写两份,直接写LOG是常规动作. ...
- Shell中sort-cut-wc详解
sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 ...
- 【bzoj4417】[Shoi2013]超级跳马 矩阵乘法
题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法. ...
- Python 编程实战提高测试工作效率实例之svn 文件管理
#coding=utf-8 ''' Created on 2016年8月22日 @author:Tom Gao ''' importre importos importtime "" ...
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...
- git与svn与github与码云的区别
1.git与github(https://www.oschina.net/)的区别 Git(https://git-scm.com/)是一个版本控制工具 github是一个用git做版本控制的项目托管 ...
- layer 限定时间消失
默认tips层几秒后自动关闭.请问如何实现类似页面层时,点击页面层外部遮罩手动关闭的效果? 下面我加了time: 20000 时间控制在20秒后自动关闭,但是显得比较呆板,不如用户手动点击关闭来的灵活 ...
- json 拼二维json数组
js声明数组 以及向数组中添加as移除json数据 JavaScript声明JSON数组的方法: //部分条件,在数据渲上数据要求是数组格式而非json数组格式,取arrayJson.dataList ...