当前位置:首页 > 问答 > 正文

SQL Server里头怎么才能弄开那个Ad Hoc Distributed Queries功能啊,步骤啥的要注意些什么

需要明白 Ad Hoc Distributed Queries 这个功能是干什么的,它允许你在一台 SQL Server 数据库服务器上,直接使用 T-SQL 语句去查询另一台服务器上的数据源,比如另一个 SQL Server 数据库、一个 Excel 文件、或者一个 Access 数据库等,它用的是 OPENROWSET 和 OPENDATASOURCE 这两个函数来实现跨服务器的“即席”查询,意思就是不用预先建立长期的链接服务器,临时用一下。(来源:微软官方文档对 Ad Hoc Distributed Queries 的解释)

重要警告:在开始操作之前,你必须清楚开启这个功能是有安全风险的。 因为它允许数据库引擎访问外部的数据源,如果被恶意利用,可能会带来数据泄露或其它安全威胁,原则是:除非你的应用程序确实需要这个功能,否则不要开启。 如果只是临时使用,用完后最好马上关闭。(来源:数据库安全最佳实践)

下面就是具体的步骤,我们分两大步走:先用 SQL 语句配置,再用图形化界面配置,推荐对 SQL Server 不熟悉的管理员使用图形化界面,更直观。

使用 T-SQL 语句进行配置(最直接的方法)

这个方法需要你具有管理员权限,比如使用 sa 账户或者具有 sysadmin 角色的账户登录到 SQL Server Management Studio (SSMS),然后新建一个查询窗口。

步骤 1:检查当前状态

在改动任何设置之前,先看看这个功能现在是开还是关,可以执行下面的语句来查看:

SELECT * FROM sys.configurations WHERE name = 'Ad Hoc Distributed Queries';

执行后,你会看到一个结果集,找到 value_in_use 这一列,如果它的值是 0,表示功能是关闭的;如果是 1,表示功能是开启的。value 列表示配置值,通常和 value_in_use 一致。

SQL Server里头怎么才能弄开那个Ad Hoc Distributed Queries功能啊,步骤啥的要注意些什么

步骤 2:启用功能

如果上一步查出来是 0,你需要执行下面的语句来开启它:

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

这里解释一下这几行命令在干什么:

  • 第一行 sp_configure 'show advanced options', 1;:意思是告诉 SQL Server,“我要看并且修改那些高级的配置选项”,因为“Ad Hoc Distributed Queries”属于高级选项,默认是隐藏的,所以必须先执行这一步把它显示出来。
  • 第二行 RECONFIGURE;:意思是让刚才的“显示高级选项”的设置立即生效。
  • 第三行 sp_configure 'Ad Hoc Distributed Queries', 1;:这才是真正地把“Ad Hoc Distributed Queries”这个选项的值设置为 1,也就是启用。
  • 第四行 RECONFIGURE;:再次执行,让启用 Ad Hoc Distributed Queries 的设置立即生效。
  • GO 是一个批处理指令,用来分隔语句。

步骤 3:确认启用成功

再次执行步骤 1 的检查语句,确认 value_in_use 已经变成了 1。

SQL Server里头怎么才能弄开那个Ad Hoc Distributed Queries功能啊,步骤啥的要注意些什么

SELECT * FROM sys.configurations WHERE name = 'Ad Hoc Distributed Queries';

到这一步,功能就已经开启了,你现在可以尝试使用 OPENROWSETOPENDATASOURCE 函数来查询外部数据了。

步骤 4:(可选)使用完毕后关闭功能

为了安全起见,如果你只是临时使用,用完后建议按照类似的步骤把它关掉。

sp_configure 'Ad Hoc Distributed Queries', 0;
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
RECONFIGURE;
GO

使用 SQL Server Management Studio (SSMS) 图形化界面配置

如果你不太熟悉 T-SQL 命令,觉得敲代码有压力,那么用图形化界面点点鼠标也能完成同样的操作。

步骤 1:连接服务器并找到服务器属性

SQL Server里头怎么才能弄开那个Ad Hoc Distributed Queries功能啊,步骤啥的要注意些什么

  1. 用有管理员权限的账户登录 SSMS。
  2. 在“对象资源管理器”中,右键点击你的服务器名字(最顶层的那个),然后选择“属性”。

步骤 2:找到高级配置页面

会弹出一个“服务器属性”的窗口,在左边的一排标签页中,找到并点击“高级”。

步骤 3:修改配置值

  1. 在“高级”页面的右侧,你会看到一个很长列表,叫做“其他选项”。
  2. 在这个列表里,耐心地向下滚动,找到名为 “Ad Hoc Distributed Queries” 的这一行。
  3. 你会发现它的值默认可能是 “False”,点击它,会变成一个下拉框,你把它改成 “True”。
  4. 点击“确定”按钮保存设置。

步骤 4:重启 SQL Server 服务(重要!)

注意: 通过图形界面修改这个高级选项后,修改可能不会立即生效,根据 SQL Server 的版本和配置,有时候需要重启 SQL Server 服务才能使设置生效,而之前用 T-SQL 命令的 RECONFIGURE 通常可以立即生效,这是两种方法的一个主要区别。

重启服务的方法:

  1. 在“对象资源管理器”中再次右键点击服务器名称。
  2. 选择“重新启动”,系统会提示你确认,确认后服务会重启,期间数据库会有一小段不可用的时间,所以这个操作一定要在业务低峰期进行。

重启完成后,Ad Hoc Distributed Queries 功能就启用了。

使用功能时需要注意的关键点

  1. 连接字符串要写对:使用 OPENROWSETOPENDATASOURCE 时,你需要提供一个连接字符串来告诉 SQL Server 外部数据源在哪里、怎么连接,这个字符串的格式非常关键,写错一个字母都连不上,比如连接另一个 SQL Server 和连接一个 Excel 文件的字符串是完全不同的,具体格式需要查阅微软官方文档。
  2. 权限问题:即使功能开启了,执行查询的数据库登录账号本身也需要有足够的权限,一方面要有权限在本地执行这些特殊查询,另一方面还要有权限去访问那个外部数据源(比如外部数据库的账号密码)。
  3. 性能考虑:这种即席查询的效率通常不如直接链接服务器或在数据源本地查询,如果数据量大或查询频繁,可能会对性能产生影响。
  4. 防火墙和网络:既然是访问外部数据源,就要确保你的 SQL Server 所在服务器和外部数据源之间的网络是通的,防火墙没有阻挡必要的端口(SQL Server 的 1433 端口)。

开启 Ad Hoc Distributed Queries 功能本身并不复杂,核心就是修改一个服务器配置参数,但真正的难点和需要注意的地方在于:权衡安全风险、确保只在必要时开启、以及在使用时正确编写连接字符串和处理权限问题。 在做任何生产环境的修改前,强烈建议先在测试环境进行充分的验证。