【问题标题】:What is wrong with this specific t-sql query for a table located on a linked Server?对位于链接服务器上的表的特定 t-sql 查询有什么问题?
【发布时间】:2021-10-22 07:33:09
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 谢谢。我根据该网页上的示例进行了尝试,但它不起作用:EXEC sp_columns_ex 'Server IP', 'Table1', 'Database Name'
  • select * from [Server IP].[Database Name on linked Server].sys.columns 返回什么?
  • @Charlieface 查询中没有表名?
  • 你可以加入sys.tables过滤它select 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 and t.name = 'Table1'

标签: sql-server tsql linked-server


【解决方案1】:

问题是你没有引号,你没有把你的值变成一个文字字符串。这可以在没有链接服务器的情况下轻松复制:

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 被解释为文字字符串,根据documentation

如果您传递一个不以 @ 开头且未用引号括起来的单词 - 例如,如果您在参数名称上忘记了 @ - 该单词将被视为 nvarchar 字符串,尽管缺少引号标记。

所以MyTable 被视为N'MyTable'。对于后一个电话,这是不正确的。这也记录在案(根据上述),并且还明确指出了对象名称:

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

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

'.' 附近的语法不正确。

因此,对于上述内容,请引用您的字符串。就是这么简单:

EXEC sp_columns N'dbo.MyTable';

【讨论】:

  • 谢谢。我试了一下,但它仍然抛出错误。报价应仅适用于 'dbo.Table1' ?
  • "引号应该只针对 'dbo.Table1' 吗?" "整个名称必须用单引号括起来" @user3115933 ...
  • 好的。我试过了,但还是不行:exec sp_columns N 'xxx.xx.x.20.HMS.dbo.Table1'
  • N'xxx.xx.x.20.HMS.dbo.Table1 有 7 个部分,@user3115933 ... 不能超过 4 个部分。 [Server Name].[Database Name].[Schema Name].[Object Name]。大概您已经创建了一个名称中带有. 的对象;恐怕这是一个非常糟糕的决定。您需要用非标准名称分隔标识对象。
  • 猜测前 4 个“paats”实际上是一个 IP,所以可能是N'[xxx.xx.x.20].HMS.dbo.Table1'
【解决方案2】:

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

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'

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多