如何修改我现有的 T-SQL 查询以适用于链接服务器?

use*_*933 0 sql-server t-sql linked-server

我正在使用SQL Server 2014并且我需要修改我现有的T-SQL查询,以便它适用于链接服务器。

我现有的代码如下:

USE [MyDatabase]

SELECT name 
FROM sysobjects
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%SPA%' )
Run Code Online (Sandbox Code Playgroud)

我通常使用以下方法连接到链接服务器:

Use [MyDatabase]

Select * from [xxx.xx.0.20].[LinkedDatabaseName].dbo.[TableName]
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这里给出的答案(但它仍然不起作用):无法通过链接服务器查询 SQL 服务器元数据

这是我的尝试(尽管与上面显示的现有代码相比,我不太明白为什么我需要将该点 (.) 放在 sysobjects 中):

   USE [MyDatabase]
    
    SELECT name 
    FROM [xxx.xx.0.20].[LinkedDatabaseName].sys.objects
    WHERE id IN ( SELECT id 
                  FROM syscolumns 
                  WHERE name like '%SPA%' )
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:“无效的列名 'id'。”

Han*_*non 5

您需要将查询中的所有引用都指向链接服务器另一端的表。

IE:

USE [MyDatabase]
    
SELECT name 
FROM [xxx.xx.0.20].[LinkedDatabaseName].sys.objects o
WHERE o.object_id IN ( SELECT c.object_id 
              FROM [xxx.xx.0.20].[LinkedDatabaseName].sys.columns c
              WHERE c.[name] like '%SPA%' );
Run Code Online (Sandbox Code Playgroud)

您当前的查询版本正在sys.objects从远程数据库和syscolumns当前上下文中的本地数据库中查看。

您应该避免使用,syscolumns因为这是一个已弃用的对象。相反,使用sys.columns. id您要查找的列实际上是object_id,或者对于列 id,它是column_id

由于您通过链接服务器通过四部分命名直接引用数据库USE [MyDatabase],因此第一行中的 无关紧要。