简言:

  • 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理

SqlServer跨服务器查询的方式

  • 以往自己才疏学浅,学习了一波之后,在这记录下来。

1. 使用sp_addlinkedserver和sp_addlinkedsrvlogin存储过程添加linkserver和登录

							--别名						//ip地址
exec sp_addlinkedserver 'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
--别名 --登录名 --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
--注意:两个别名要一致 --然后就可以通过以下方式进行联合查询:
--上面的别名 --数据库名
select * from [v3cdemo].[dbo].[AmmUnit] as ad1 right join interlink.[v3cdemo].
--表名
[dbo].[Address] as ad2 on ad1.unitID=ad2.AddressID --删除某个linkserver
exec sp_dropserver 'interlink ', 'droplogins '

运行效果如图:

2. 使用openrowset函数

exec sp_configure 'show advanced options',1
go
RECONFIGURE WITH OVERRIDE; --这里一定要加 with override 不然会出现不允许修改错误 exec sp_configure 'Ad Hoc Distributed Queries',1
go
RECONFIGURE WITH OVERRIDE;
--ip地址 --用户名 --密码
select * from openrowset( 'SQLOLEDB ', '192.168.0.12 '; 'sa'; '*bf123',[v3cdemo].[dbo].[Address]) --数据库.表名 exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure --1. 有关 show advanced options的介绍请阅读:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms188265(v=sql.90)
--2. Ad Hoc Distributed Queries :分散式查询。
  • 运行结果如下:

3. 使用openquery函数

  • openquery是基于linkserver实现的,得先添加一个linkserver
							--别名						//ip地址
exec sp_addlinkedserver 'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
--别名 --登录名 --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
--使用openquery函数
select * FROM openquery(interlink, 'SELECT * FROM [v3cdemo].[dbo].[Address] ') --也可以把本地表导入到服务器表
--insert openquery(interlink, 'SELECT * FROM dbName.dbo.tableName ') select * from localTableName
  • 运行结果如图:

4. 使用opendatasource函数

  • SELECT   * FROM   opendatasource( 'SQLOLEDB ',  'Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx' ).[v3cdemo].[dbo].[Address]
    
    --[v3cdemo]:是数据库名
    --[dbo].[Address]:是表名
    --Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx这个类似于我们的连接字符串,只是不需要指定数据库。
  • 运行结果如图:

SqlServer分布式事务:

  • .net framework:

    • TransactionScpoe:TransactionScope是ADO.Net提供的事务机制(需要添加对system.transactioins程序集的引用),在普通ADO.Net代码中也可以用、在Entity Framework、Dapper等ORM中也可以用;把相关需要事务处理的代码用TransactionScope包裹起来即可,只要没有Complete()的就会回滚

      • 深入:

        使用TransactionScope包围的范围,只要是同一个连接字符串创建的SqlConnection对象(MySQL等也支持),即使是多个Connection对象也会在一个事务中。

        还支持嵌套事务,这个在开发大型系统中会涉及到,因为大型系统中一个方法会在很多地方被使用,一个方法有时候是自己独立完成一件事情,有时候是被别人组合完成一件事。 TransactionScope可以嵌套, TransactionScope嵌套的情况,只有最外层的TransactionScope提交后所有的操作才会提交,否则所有操作都回滚。

      • 注意:如果在TransactionScope嵌套的范围内出现多个不同连接字符串构成的Connection(比如同时连接多个同构或者异构的数据库)则需要启用MSDTC服务,否则会“MSDTC不可用”的异常,即使数据库ip地址从127.0.0.1变成localhost甚至加上一个无关痛痒的空格都会要求启用MSDTC服务。

  • .net core:
  • 因为.net core已经是跨平台了,而MSDTC服务是windows平台的东西,所以.net core 中的Transactionscope实现不包括对分布式事务的支持,因此不能使用 TransactionScope 或CommittableTransaction 来跨多个资源管理器协调。
  • 可以使用 **Saga ** 来实现事务一致性:https://www.upyun.com/opentalk/310.html(saga只支持postpresql和mysql数据库。偷懒)
  • sage GitHub地址C#包:https://github.com/OpenSagas-csharp/servicecomb-pack-csharp

Sqlserver分布式跨数据库查询、Join,以及分布式事务的更多相关文章

  1. 一条SQL完成跨数据库实例Join查询

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  2. 不同SQL Server数据库之间的跨数据库查询

    --不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...

  3. Sqlserver 2005 跨数据库 导入数据

    --Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...

  4. ORACLE跨数据库查询的方法

    原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...

  5. 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)

    在上篇随笔中,我们发现Entity Framework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlo ...

  6. 如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参

    [前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC ...

  7. SQL SERVER SP命令及实现跨数据库查询

    1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息. 例:sp_helpdb   --显示所有数据库信息(名称.大小等) 例:sp_helpdb Recruitment   ...

  8. 基于双下划线的跨表查询 (join查询)

    因为你的数据库中的查询就是重点  那么你的django提供的orm也是查询语句最重点 ,也提供的查询方法比较的多,下面我们学习下类似于MYSQL的连表(join)查询 Django 还提供了一种直观而 ...

  9. SQL分布式查询、跨数据库查询

    --[方法1]连接服务器方法 --step1 创建链接服务器  exec sp_addlinkedserver     'srv_lnk','','SQLOLEDB', 'ip地址'  exec sp ...

  10. SQL Server 跨数据库查询

    语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * F ...

随机推荐

  1. 在Ubuntu 主机上使用 Cockpit 管理容器

    如果你管理着一台 Linux 服务器,那么你可能正在寻找一个可靠的管理工具.为了这个你可能已经看了 Webmin 和 cPanel 这类软件.但是,如果你正在寻找一种简单的方法来管理还包括了 Dock ...

  2. 组合总和 II

    组合总和 II 题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  3. Vue实现拖拽穿梭框功能四种方式

    一.使用原生js实现拖拽 点击打开视频讲解更加详细 <html lang="en"> <head> <meta charset="UTF-8 ...

  4. 一文读懂Apache Geode缓存中间件

    目录 一.对缓存中间件的诉求 1.1 我们为什么需要缓存中间件 1.2 缓存的分类 1.1.1 弱势缓存 1.1.2 强势缓存 二.什么是Apache Geode 2.1 Apache Geode的架 ...

  5. 微信小程序中视频的显示与隐藏

    在微信小程序中实现视频的播放与暂停 需求: 视频列表中只能有一个视频在播放 点击视频实现播放与暂停功能 加载完成显示图片,点击后变为视频播放 从上次播放的位置进行播放 思路: 定义一个标记变量,控制视 ...

  6. API接口笔记

    1.基类   定义返回信息 protected $user; //用户表 protected $token; //用户token protected $isSuccess = FALSE; //状态是 ...

  7. Dapr v1.9.0 版本已发布

    Dapr是一套开源.可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性.微服务.无状态以及有状态等应用程序类型.Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统 ...

  8. C语言经典编程100题

    程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

  9. python的微积分运算

    import sympy sympy.init_printing() from sympy import I, pi, oo import numpy as np 求函数的导数 x = sympy.S ...

  10. 14.-F对象和Q对象

    一.F对象 一个F对象代表数据库中某条记录的字段的信息 作用 通常是对数据库中的字段值在不获取的情况下进行操作 用于属性(字段)之间的比较   语法: from django.db.models im ...