对于位于链接服务器上的表,这个特定的t-sql查询有什么问题?



我使用的是SQL Server 2014,我有以下简单的t-sql查询,其中列出了我本地数据库上的表中的所有列及其相关数据类型。

USE [MyDatabase]
exec sp_columns [Table1]

我想查询位于链接服务器上的同一个表。然而,在我的查询中一定有什么问题,因为我得到了一个"不正确的语法"。错误:

USE [MyDatabase]
exec sp_columns [Server IP].[Database Name on linked Server].dbo.[Table1]

如有任何帮助,不胜感激。

问题是缺少引号,您没有使值成为字面值字符串。这可以在没有链接服务器的情况下轻松复制:

CREATE TABLE dbo.MyTable (ID int);
GO
EXEC sys.sp_columns MyTable;
GO
EXEC sys.sp_columns dbo.MyTable;
GO
DROP TABLE dbo.MyTable;

sys.sp_columns的第一个调用工作正常,因为文字MyTable被解释为文字字符串,根据文档:

如果传递一个不以@开头且没有括在引号内的单词(例如,如果您在参数名称中忘记了@),则该单词将被视为非archar字符串,尽管缺少引号。

则将MyTable当作N'MyTable'处理。对于后一种呼叫,这是不正确的。这也是有文档记录的(根据上面),并且还显式地调用对象名称:

如果参数的值是对象名称、字符串或由数据库名称或模式名称限定的值,整个名称必须用单引号括起来. 如果参数的值是关键字,则必须将关键字用双引号括起来。

我特别强调。你没有引用你的字符串,所以它出错了。

'.'附近语法错误。

因此,对于上面的代码,引用字符串。就是这么简单:

EXEC sp_columns N'dbo.MyTable';

您可以通过正常的链接服务器名称查询系统表

select
typename = typ.name,
c.*
from [Server IP].[Database Name on linked Server].sys.columns c
join [Server IP].[Database Name on linked Server].sys.tables t on t.object_id = c.object_id
join [Server IP].[Database Name on linked Server].sys.schemas s on s.schema_id = t.schema_id
join [Server IP].[Database Name on linked Server].sys.types typ on typ.system_type_id = c.system_type_id
where t.name = 'Table1'
and s.name = 'SchemaName'

最新更新