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'。”
您需要将查询中的所有引用都指向链接服务器另一端的表。
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]
,因此第一行中的 无关紧要。