sqlserver链接服务器到mysql

SQL Server数据库如何添加mysql链接服务器(Windows系统)_sqlserver链接服务器mysql-CSDN博客

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
USE [master];
GO

-- ======【修改以下参数】======
DECLARE @LinkedServerName NVARCHAR(128) = N'MYSQLCON'; --链接服务器名
DECLARE @ODBC_DSN         NVARCHAR(128) = N'mysql_odbc'; --mysqlodbc 名,必须保持一致
DECLARE @RemoteUser       NVARCHAR(128) = N'admin'; --账号
DECLARE @RemotePassword   NVARCHAR(128) = N'admin123'; --密码
-- ============================

-- 删除已存在的链接服务器
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = @LinkedServerName)
    EXEC sp_dropserver @LinkedServerName, 'droplogins';

-- 创建链接服务器(MSDASQL + ODBC DSN)
EXEC sp_addlinkedserver
    @server     = @LinkedServerName,
    @provider   = N'MSDASQL',
	@srvproduct = N'MySQL',
    @datasrc    = @ODBC_DSN;

-- 设置登录凭据
EXEC sp_addlinkedsrvlogin
    @rmtsrvname  = @LinkedServerName,
    @useself     = N'False',
    @locallogin  = NULL,
    @rmtuser     = @RemoteUser,
    @rmtpassword = @RemotePassword;

-- 【可选】仅保留关键选项(防中文乱码)
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'use remote collation', @optvalue = N'true';

sqlserver链接服务器到mysql 无dsn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
USE [master];
GO

-- ======【修改以下参数】======
DECLARE @LinkedServerName NVARCHAR(128) = N'MYSQLCON';        -- 链接服务器名称
DECLARE @MySQL_Host       NVARCHAR(128) = N'127.0.0.1';    -- MySQL 服务器 IP 或主机名
DECLARE @MySQL_Port       INT           = 3306;               -- MySQL 端口
DECLARE @MySQL_Database   NVARCHAR(128) = N'gmsabdrmsdc';            -- 数据库名(可选,查询时可指定)
DECLARE @RemoteUser       NVARCHAR(128) = N'admin';           -- MySQL 用户名
DECLARE @RemotePassword   NVARCHAR(128) = N'admin123';        -- MySQL 密码

-- 注意:驱动名称必须与系统中安装的 MySQL ODBC 驱动完全一致!
DECLARE @DriverName       NVARCHAR(256) = N'MySQL ODBC 8.1 Unicode Driver';
-- 常见驱动名还有:
-- 'MySQL ODBC 8.0 ANSI Driver'
-- 'MySQL ODBC 5.3 Unicode Driver'
-- 可通过 ODBC 数据源管理器查看
-- ============================

-- 删除已存在的链接服务器
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = @LinkedServerName)
    EXEC sp_dropserver @LinkedServerName, 'droplogins';

-- 构造连接字符串(关键!)
DECLARE @ProvStr NVARCHAR(1024);
SET @ProvStr = 
    N'DRIVER={' + @DriverName + N'};' +
    N'SERVER=' + @MySQL_Host + N';' +
    N'PORT=' + CAST(@MySQL_Port AS NVARCHAR(10)) + N';' +
    CASE WHEN @MySQL_Database <> N'' THEN N'DATABASE=' + @MySQL_Database + N';' ELSE N'' END +
    N'UID=' + @RemoteUser + N';' +
    N'PWD=' + @RemotePassword + N';' +
    N'OPTION=3;';  -- OPTION=3 表示启用 ANSI 引用符等,可选但推荐

-- 创建链接服务器(无 DSN)
EXEC sp_addlinkedserver
    @server     = @LinkedServerName,
    @srvproduct = N'MySQL',
    @provider   = N'MSDASQL',
    @provstr    = @ProvStr;

-- 【重要】对于 MSDASQL 无 DSN,通常不需要再调用 sp_addlinkedsrvlogin!
-- 因为用户名/密码已在连接字符串中提供。
-- 但如果仍提示登录失败,可尝试添加(但一般不建议重复):
-- EXEC sp_addlinkedsrvlogin
--     @rmtsrvname = @LinkedServerName,
--     @useself = N'False',
--     @locallogin = NULL,
--     @rmtuser = @RemoteUser,
--     @rmtpassword = @RemotePassword;

-- 设置关键选项
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'use remote collation', @optvalue = N'true';
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'data access',         @optvalue = N'true';

查询

1
SELECT * FROM OPENQUERY(MYSQLCON, 'SELECT * from 表名');

sqlserver 链接服务器到sqlserver 无dsn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
USE [master];
GO

-- 参数化(方便修改)
DECLARE @LinkedServerName NVARCHAR(128) = N'fkt';
DECLARE @RemoteHost       NVARCHAR(128) = N'171.111.192.34,2431';  -- 替换为实际 IP,端口
DECLARE @RemoteUser       NVARCHAR(128) = N'sa';
DECLARE @RemotePassword   NVARCHAR(128) = N'@fkt123..';

-- 删除已存在的(可选,避免报错)
IF EXISTS (SELECT * FROM sys.servers WHERE name = @LinkedServerName)
    EXEC sp_dropserver @LinkedServerName, 'droplogins';

-- 创建链接服务器
EXEC sp_addlinkedserver
    @server     = @LinkedServerName,
    @provider   = N'SQLNCLI',
	@srvproduct = N'SqlServer',
    @datasrc    = @RemoteHost;

-- 设置登录凭据
EXEC sp_addlinkedsrvlogin
    @rmtsrvname  = @LinkedServerName,
    @useself     = N'False',
    @locallogin  = NULL,
    @rmtuser     = @RemoteUser,
    @rmtpassword = @RemotePassword;

sqlserver 链接服务器 oracle

Instant Client for Microsoft Windows (x64) 64-bit

选择:

  • Instant Client Package - Basic
  • Instant Client Package - OLE DB(关键!)
  • 版本需与 Oracle 服务器兼容(如 19c、21c)

注册 OLE DB 驱动(通常安装后自动注册) 驱动名称为:==OraOLEDB.Oracle==

配置 tnsnames.ora(可选但推荐) 文件路径示例:C:\oracle\instantclient_19_20\network\admin\tnsnames.ora

1
2
3
4
5
6
7
8
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.50)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

方式一:使用 TNS 别名(推荐,更清晰)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
USE [master];
GO

-- ======【修改参数】======
DECLARE @LinkedServerName NVARCHAR(128) = N'ORACLE_LS';
DECLARE @TNS_Alias        NVARCHAR(128) = N'ORCL';          -- tnsnames.ora 中的别名
DECLARE @OracleUser       NVARCHAR(128) = N'scott';
DECLARE @OraclePassword   NVARCHAR(128) = N'tiger';
-- ========================

-- 删除已存在的
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = @LinkedServerName)
    EXEC sp_dropserver @LinkedServerName, 'droplogins';

-- 创建链接服务器(使用 TNS 别名)
EXEC sp_addlinkedserver
    @server     = @LinkedServerName,
    @srvproduct = N'Oracle',
    @provider   = N'OraOLEDB.Oracle',
    @datasrc    = @TNS_Alias;  -- 对应 tnsnames.ora 中的别名

-- 设置登录凭据
EXEC sp_addlinkedsrvlogin
    @rmtsrvname  = @LinkedServerName,
    @useself     = N'False',
    @locallogin  = NULL,
    @rmtuser     = @OracleUser,
    @rmtpassword = @OraclePassword;

-- 设置关键选项
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'data access',         @optvalue = N'true';
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'rpc out',             @optvalue = N'true';
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'collation compatible',@optvalue = N'false';
EXEC sp_serveroption @server = @LinkedServerName, @optname = N'use remote collation',@optvalue = N'true';

方式二:直接写连接字符串(无需 tnsnames.ora)

1
2
3
4
5
6
7
8
-- 构造数据源(格式://host:port/service_name)
DECLARE @DataSource NVARCHAR(256) = N'//192.168.1.50:1521/orcl';

EXEC sp_addlinkedserver
    @server     = N'ORACLE_LS',
    @srvproduct = N'Oracle',
    @provider   = N'OraOLEDB.Oracle',
    @datasrc    = @DataSource;

查询

1
2
3
4
5
-- 测试查询(注意 Oracle 表名大写!)
SELECT * FROM OPENQUERY(ORACLE_LS, 'SELECT * FROM SCOTT.EMP WHERE ROWNUM <= 5');

-- 或使用四部分命名(不推荐,可能有元数据问题)
-- SELECT * FROM ORACLE_LS..SCOTT.EMP;

sqlserver链接oracle数据库 ODBC + DSN-less

需要instantclient_21_19 包含odbc_install.exe

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
USE [master];
GO

DECLARE @ProvStr NVARCHAR(1024);
SET @ProvStr = 
    N'DRIVER={Oracle in instantclient_21_19};' +
    N'DBQ=153.0.165.91:16161/orcl;' +        -- ← 关键!使用 DBQ + EZ Connect
    N'UID=dherp_bzk;' +
    N'PWD=qwer1234;';

-- 删除已存在的链接服务器
IF EXISTS (SELECT 1 FROM sys.servers WHERE name = N'ORACLE_LS')
    EXEC sp_dropserver N'ORACLE_LS', 'droplogins';

-- 创建链接服务器
EXEC sp_addlinkedserver
    @server     = N'ORACLE_LS',
    @srvproduct = N'Oracle',
    @provider   = N'MSDASQL',
    @provstr    = @ProvStr;

-- 启用数据访问
EXEC sp_serveroption @server = N'ORACLE_LS', @optname = N'data access', @optvalue = N'true';