在SQL Server中使用链接服务器数据库创建视图

17
如何在链接的服务器数据库上创建视图。例如,我有一个名为[1.2.3.4]的链接服务器位于[5.6.7.8]上。这两个数据库服务器都是SQL Server 2005。我想使用链接服务器上的表在[5.6.7.8]上创建视图。
编辑:当使用完整名称[1.2.3.4].db.dbo.table创建时,我会收到此错误。
SQL执行错误。
已执行的SQL语句:SELECT * FROM 1.2.3.4.db.dbo.table(您可以看到没有括号。) 错误来源:.Net SqlClient数据提供程序 错误消息:'0.0'附近的语法不正确 ---> IP地址的一部分。
我只是在Management Studio中创建它,因为它尚未创建。我改变了IP地址。在图片中,您可以看到IP周围没有括号,但我给出了它,当出现错误时,这些括号被删除。
谢谢。

请发布完整的视图创建脚本(或更多),以及用于访问该视图的代码。 - David M
555.555.555.555 不是一个有效的 IP 地址。每个数字最大可以是 255,它需要是一个有效的 IP 地址。例如,您应该能够 ping 到 IP 地址:ping 10.1.16.1。通常使用服务器名称而不是 IP 地址更有意义。 - Ryan
1
感谢您的回复。555.555.555.555不是我正在使用的IP地址。我故意更改了它。 - Kashif
7个回答

26

您需要使用四部分限定名称:linkedserver.database.schema.table

SELECT * FROM [1.2.3.4].Northwind.dbo.Customers

以下是一个有关访问对象名称的MSDN文章:accessing object names

您可能希望尝试手动创建视图,而不是使用 SQL 管理工具:

CREATE VIEW [dbo].[sywx]
AS
    SELECT  *
    FROM    [1.2.3.4].Atia.dbo.IpPbxDCR
GO

我还建议您尽可能使用连接服务器的名称,而不是使用IP地址。


13

这是一个 SQL Management Studio 的问题。如果您尝试使用管理工具的“新建视图”功能创建视图,则会出现语法错误。

但是,如果您使用 SQL 查询:

CREATE VIEW [dbo].[viewname] 
AS 
    SELECT  * 
    FROM    [0.0.0.0].database.dbo.table 
GO 

那么它就会起作用。

为了测试,当您刷新视图时,您将看到创建的视图。如果您只从该视图执行选择查询,您将看到该视图返回结果。

但是,如果您尝试进入该视图的设计模式并尝试执行设计查询,则尽管成功创建了该视图,但错误仍将弹出。


非常感谢您的帮助。我的联接服务器名称中有一个连字符,这导致 Management Studio 2005 出现问题。您提供的解决方案解决了这个问题。 - Tim Richardson
那就是我所遇到的问题。我过于重视“未解决的对象”警告了。谢谢Phil。 - Vic Colborn

2
如果已经设置了关联服务器,您只需使用四部分限定名称引用其上的表即可:
linkedserver.database.schema.table

如果你的联接服务器名称是 [0.0.0.0],你可以这样引用一个表:

[0.0.0.0].database.schema.table

2
您的主要问题是使用数字(IP地址)给您的链接服务器命名。唯一对我有效的方法是使用一个没有任何点“.”的字母名称来命名我的链接服务器。 您可以使用以下代码行添加您的链接服务器和身份验证:
    EXEC sp_addlinkedserver   
        @server='TEST_LINK', 
        @srvproduct='',
        @provider='SQLNCLI', 
        @datasrc='tcp:0.0.0.0'

    EXEC sp_addlinkedsrvlogin
        @useself='FALSE',
        @rmtsrvname='TEST_LINK',
        @rmtuser='user',
        @rmtpassword='secret'

你可以在这里找到原始答案here

只要你将IP地址括在方括号内,它就能正常工作。 - influent
这是一个很好的解决方案,当您的DNS无法正确解析名称时,可以创建带有别名的链接服务器。 - EAmez

1
对于使用点作为Web服务名称的链接服务器-这将无法工作。 代码详细信息和差异步骤已发布在以下网址: http://www.access-programmers.co.uk/forums/showthread.php?t=260764 例如:FROM [V2.EGG.COM]..[NAT_DBA].[NV_WELLS] 在SSMS 2008中,括号内的[V2.EGG.COM]..被编辑器删除了。然后更新失败,因为超过了4个部分。 一直在徒劳地寻找解决方法。 可以在上述链接中找到适用的脚本。

0

你也可以直接将链接服务器中的表/视图对象拖放到你的视图中,管理工具会自动为你创建包含四部分引用的引用。


从已定义的链接服务器拖放到我的管理工作室视图中没有起作用 - 接口(Management Studio 2008)不允许我拖放。也许链接服务器中有一个阻止此操作的设置? - David Conlisk

0

在访问联接服务器之前,您需要先定义一个联接服务器,因为联接服务器条目还包含身份验证详细信息。

创建联接服务器后,您可以使用点表示法 servername.database.[owner].object 访问其数据库及其对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接