在数据库项目中将链接服务器与OPENQUERY一起使用


10

我有一个SQL Server 2008,运行一个我想放入TFS的数据库。因此,我在导入数据库的地方使用了Visual Studio 2013数据库项目。修复了一堆错误之后,我只剩下一个错误:

在一个视图中,开发人员用来OPENQUERY访问链接服务器。因此,我导入了包含正确数据库的DACPAC,并Add Database Reference使用以下参考选项将其添加到项目中。

数据库参考设置

初始脚本版本

这是原始视图创建的简短版本:

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1

这导致以下错误:

错误136 SQL71501:视图:[dbo]。[vwStatus]具有对对象[LinkedServer]的未解析的引用。

第一次尝试

所以我试图插入服务器名称变量

FROM       OPENQUERY($(LinkedServer), 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1

这导致

错误176 SQL46010:$(LinkedServer)附近的语法不正确。

进一步尝试

我摆弄了arround并尝试了以下操作(启用和不启用引用标识符):

FROM       OPENQUERY("$(LinkedServer)", 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([$(LinkedServer)], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([LinkedServer], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY("LinkedServer", 'SELECT * FROM [DB].[dbo].tbStatus') AS 

我总是遇到错误。

我不知道我在这里俯瞰什么。你做?谢谢你的时间!

(很遗憾,我无法添加visual-studio-2013标签,因此我使用了visual-studio)

Answers:


9

我设法使其工作:

我创建了一个新的数据库项目master。在其中,我创建了一个文件夹Server Object和一个文件LinkedServer.sql。在SQL文件中,我添加了链接服务器:

GO
EXECUTE sp_addlinkedserver @server = N'LinkedServer', @srvproduct = N'sqlserver', @provider = N'SQLNCLI', @datasrc = N'LinkedServer.domain';

在将数据库Project添加master到我的解决方案中并在我的原始数据库项目中引用它之后,我能够使用初始语法来构建该项目。

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1

尽管那里有一个包含LinkedServers.sql文件的主项目,我仍然无法使它工作
测试

好吧,如果没有更多信息,很难提供帮助。也许最好再问一个问题。在解决方案中引用您的主项目很重要。否则,这完全符合我的描述。
2014年

在您的解决方案中-您是否具有LinkedServer DBA的dacpac或项目?
Martin Meeser

嗨,我不记得了,但是我在第二段中写道,我使用了dacpacs。但是对于最终解决方案,我引用了主数据库的数据库项目。
Chake 2015年

1
请注意,您必须确保“ LinkedServer.sql”文件的生成操作设置为“生成”。令人讨厌的是,VS似乎无法从“预部署”脚本中识别出链接的服务器,否则所有这些都是不必要的。
塔兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.