无法使链接服务器在Sql Azure中工作

时间:2013-05-06 16:34:32

标签: sql-server azure azure-sql-database

我们正在使用Azure的试用版。我们正在尝试从我们的SQL 2012内部执行跨服务器查询。

我们似乎将本地2012与Azure相关联。当我进入Server Object - >管理工作室中的Linked Servers,我看到了Azure数据库。

但是如果我尝试打开目录和表格,我会收到一条错误消息

Reference to database and/or server name in 'Perseus.sys.sp_tables_rowset2' is not supported in this version of SQL Server

** Perseus Azure Sql中目录的名称。

从本地连接运行查询:

SELECT *  FROM [azureDBServer].[Perseus].[dbo].[accounts]

结果是:

    OLE DB provider "SQLNCLI11" for linked server "azureDBServer" returned message 
"Unspecified error". Msg 40515, Level 16, State 2, Line 1 Reference to database and/or
 server name in 'Perseus.sys.sp_tables_info_90_rowset' is not supported in this version of
 SQL Server.

同样内部SQL 2012 Server可以通过跨服务器查询和通过链接服务器查看其结构来连接到我们的内部2008.

我从这篇文章中了解到Azure supports Linked Servers

所以我迷失了什么是错的。我们的管理员认为我们可能拥有Web-Sql帐户和业务SQL帐户。这个Azure Web vs Business SQL过时的Stack链接意味着SQL版本不是问题,而是Azure提供链接服务器的前提。

所以,我试图了解是否

a)我们没有设置正确提供SQL链接的东西?

b)我们受审判限制?

c)我们是否受到Web SQL版本的限制?

d)其他什么?

6 个答案:

答案 0 :(得分:17)

需要执行下面提到的三个存储过程来添加SQL Azure。使用下面这些存储过程,我能够查询SQL azure。

EXEC sp_addlinkedserver
@server='PROD',
@srvproduct='',     
@provider='sqlncli',
@datasrc='azureserver.database.windows.net',
@location='',
@provstr='',
@catalog='database name'


EXEC sp_addlinkedsrvlogin 
@rmtsrvname = 'PROD',
@useself = 'false',
@rmtuser = 'Azure login',
@rmtpassword = 'password'

EXEC sp_serveroption 'PROD', 'rpc out', true

答案 1 :(得分:12)

从SQL Management添加链接服务器时,您无法选择设置默认数据库。所以使用下面的内容

EXEC sp_addlinkedserver
@server='name for referring locally', -- here you can specify the name of the linked server
@srvproduct='',     
@provider='sqlncli', -- using SQL Server native client
@datasrc='AzureMachineName.database.windows.net',   -- add here your server name
@location='',
@provstr='',
@catalog='yourdatabasename' 

我认为这很有效。

答案 2 :(得分:1)

您是否实际设置了与perseus数据库的连接?通过查看错误消息,您将向Azure发送包含3部分或4部分名称的查询,这在Azure中不起作用。请检查您的查询并将其设置为使用2部分名称,如果它连接到同一数据库,则只使用三部分名称

答案 3 :(得分:0)

这对我有用:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mypassword';

CREATE DATABASE SCOPED CREDENTIAL MySecurity 
WITH IDENTITY = 'mylogin',
SECRET = 'mypassword';

CREATE EXTERNAL DATA SOURCE MyDbAccess
WITH (
    TYPE=RDBMS,
    LOCATION='server name',
    DATABASE_NAME='db_name',
    CREDENTIAL= MySecurity);

CREATE EXTERNAL TABLE MyExtTable (
    [Id] [int]  NOT NULL,
    [Name] [varchar(20)] NULL)
WITH
(DATA_SOURCE = MyDbAccess);

之后,您可以使用它:

  

选择*来自MyExtTable

答案 4 :(得分:0)

只是把它扔在那里,我知道这是一个旧帖子,但我仍然偶然发现它并发现它很有帮助所以也许它仍然可以帮助其他人......无论如何,我遇到了这个错误,我的问题最终是我不能打字。对于 SERVER.Database.dbo.tableName,我在数据库中有一个错字。轻松修复复杂的声音信息:-)

答案 5 :(得分:-3)

我遇到了同样的问题,如果你不在SELECT部分​​使用星号,它也会被解决。

SELECT Row1, Row2 FROM table

将起作用

SELECT * FROM table

不会