我使用的是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'