Questions tagged «linked-server»

链接服务器允许将多个服务器作为一个查询进行操作。

2
哪一种效率更高:从链接服务器中选择还是插入到链接服务器中?
假设我必须将数据从一台服务器导出到另一台(通过链接的服务器)。哪种说法会更有效? 在源服务器中执行: INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData() 或在目标服务器中执行: INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()') 哪一个会更快并且总共消耗更少的资源管理器(源服务器和目标服务器)?两台服务器都是SQL Server 2005。

4
从一台服务器复制(数百个)表到另一台服务器(使用SSMS)
我必须将几百张表(当前为466张,但仍在增长)从一台服务器复制到另一台服务器。 我以前从来没有做过此事,所以我完全不确定如何处理它。所有表格的格式相同:Cart<Eight character customer number> 这是一个较大的项目的一部分,我将所有这些Cart<Number>表合并到一个Carts表中,但这是一个完全不同的问题。 有没有人有我可以用来复制所有这些表的最佳实践方法?如果有帮助,两台服务器上的数据库名称相同。就像我之前说的,我拥有该sa帐户,因此我可以执行将数据从A传输到B所需的一切。两个服务器也都在同一个服务器场中。

5
为什么此显式强制转换仅导致链接服务器出现问题?
我正在通过原始服务器上的视图从链接服务器查询数据。视图必须包括几个标准化列,如Created,Modified和Deleted,但是在这种情况下,源服务器上的表中不具有任何合适的信息。因此,这些列被显式转换为它们各自的类型。我更新了视图,更改了 NULL AS Modified 至 CAST(NULL as DateTime) as Modified 但是,执行此更新后,视图将触发以下错误消息: 消息7341,级别16,状态2,第3行无法从链接服务器“”的OLE DB访问接口“ SQLNCLI11”获取列“(用户生成的表达式).Expr1002”的当前行值。 我们通常在原始服务器上进行了这种“显式强制转换”更改,而无需担心,我怀疑问题可能与所涉及的服务器版本有关。我们确实不需要应用此强制转换,但感觉更干净。现在,我只是好奇为什么会这样。 服务器版本(来源): Microsoft SQL Server 2012-11.0.5058.0(X64)2014年5月14日18:34:29版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)(Hypervisor)上的Microsoft Corporation Enterprise Edition(64位) 服务器版本(链接): Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation Enterprise Edition(64位)(Hypervisor ) 编辑 我只是意识到我没有发布所有有问题的列而犯了一个错误,我必须为遗漏重要的细节表示歉意。我不知道我怎么没早注意到这一点。但是,问题仍然存在。 转换为DateTime时不会发生错误的转换,而是将列转换为UniqueIdentifier时发生。 这是罪魁祸首: CAST(NULL AS UniqueIdentifier) …

3
将行旋转为多列
我有一个SQL Server实例,该实例具有一个链接服务器到Oracle服务器。Oracle服务器上有一个名为的表,PersonOptions其中包含以下数据: ╔══════════╦══════════╗ ║ PersonID ║ OptionID ║ ╠══════════╬══════════╣ ║ 1 ║ A ║ ║ 1 ║ B ║ ║ 2 ║ C ║ ║ 3 ║ B ║ ║ 4 ║ A ║ ║ 4 ║ C ║ ╚══════════╩══════════╝ 我需要透视这些数据,因此结果是: ╔══════════╦═════════╦══════════╦══════════╗ ║ PersonID ║ OptionA ║ Option B ║ …

2
如何使用Windows身份验证使链接服务器正常工作?
我正在尝试使用域环境中的“使用登录名的当前安全上下文制作”来链接到在另一台服务器ServerB上创建的ServerA的链接服务器。我读到我需要为在每个服务器上运行SQL Server的服务帐户创建SPN,以启用Kerberos。我已经做到了,并且现在都显示身份验证方案为Kerberos,但是,我仍然面临错误: "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'". 在Active Directory中,我可以看到ServerB的服务帐户可以信任用于委派MSSQLSvc,但是我注意到ServerA的服务帐户尚未启用“信任此用户进行委派”。目标服务器是否还需要启用该选项?要使用当前的Windows登录名来使用链接服务器,是否还有其他必要?

5
为什么链接服务器在CASE表达式中限制为10个分支?
为什么这样CASE表达: SELECT CASE column WHEN 'a' THEN '1' WHEN 'b' THEN '2' ... c -> i WHEN 'j' THEN '10' WHEN 'k' THEN '11' END [col] FROM LinkedServer.database.dbo.table 产生这个结果? 错误消息:消息8180,级别16,状态1,行1的语句无法准备。消息125,级别15,状态4,第1行Case表达式只能嵌套到级别10。 显然,这里没有嵌套CASE表达式,尽管有十多个“分支”。 另一个奇怪的地方。此内联表值函数产生相同的错误: ALTER FUNCTION [dbo].[fn_MyFunction] ( @var varchar(20) ) RETURNS TABLE AS RETURN ( SELECT CASE column WHEN 'a' THEN …

3
如何重新加载链接服务器?
我正在使用Microsoft SQL Server 2014企业版。链接的服务器出现问题,需要重新启动服务器或停止MSSQLSERVER服务。当服务器再次运行时,(连接到DB2的)链接服务器无法正常工作,并且SQL Server显示此错误: 消息7302,级别16,状态1,行10 无法为链接服务器“ Airspe”创建OLE DB提供程序“ DB2OLEDB”的实例。 仅在几次重新启动服务器后,链接服务器才开始工作。 为什么需要多次重启服务器才能启动链接的服务器? 还有其他解决方案吗? 这是创建链接服务器之一的脚本: EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; Data Source=#####;Persist Security Info=True;Password=**********; User ID=######;Initial Catalog=######; Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400', @catalog=N'#####' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########' EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false' EXEC master.dbo.sp_serveroption …

3
创建指向自身的链接服务器
我正在尝试servername\instancename使用以下调用在SQL Server 2014实例上创建链接服务器: EXEC master.dbo.sp_addlinkedserver @server = N'servername\instancename', @srvproduct=N'SQL Server' 我收到错误消息: Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82 The server 'servername\instancename' already exists. 根据MSDN的说法,这在SQL Server 2005中可以正常工作。 链接服务器不必是SQL Server的另一个实例, 因此,我不确定最近的版本中有哪些更改不允许这样做。使用UI会生成类似的消息: 您不能将本地SQL Server创建为链接服务器。 我知道请求是一件奇怪的事情,但是它要支持一些在2005年有效的旧代码(以前在单独的实例上使用)。文档指出它应该可以,但是不能。有什么方法可以使其在2014年正常工作,还是我必须修改基础代码?

5
TRY-CATCH未捕获链接的服务器错误
我正在设置一项工作,以遍历链接服务器的列表并针对每个服务器执行特定的查询。我正在尝试在TRY-CATCH块中执行查询,因此如果一台特定服务器存在问题,我可以将其记录下来,然后继续使用其他服务器。 我在循环内执行的查询如下所示: BEGIN TRY SELECT * FROM OPENQUERY([server1], 'SELECT 1 AS c;'); END TRY BEGIN CATCH SELECT ERROR_NUMBER(), ERROR_MESSAGE(); END CATCH; PRINT 'We got past the Catch block!'; 如果连接到服务器有问题,则代码立即会立即失败,并且不会传输到CATCH块中。如果服务器连接但实际查询中存在错误(例如,除以零),则该错误将被该CATCH块捕获。 例如,我创建了一个链接服务器,其名称不存在。执行上面的代码时,我得到: OLE DB provider "SQLNCLI" for linked server "nonserver" returned message "Login timeout expired". OLE DB provider "SQLNCLI" for linked server …

5
SQL Server链接服务器性能:为什么远程查询如此昂贵?
我有两个通过链接服务器连接的数据库服务器。两者都是SQL Server 2008R2数据库,并且链接的服务器连接是使用当前登录名的安全上下文通过常规的“ SQL Server”链接建立的。链接的服务器都位于同一数据中心中,因此连接不成问题。 我使用以下查询来检查列的哪些值identifier可远程使用,但不能在本地使用。 SELECT identifier FROM LinkedServer.RemoteDb.schema.[TableName] EXCEPT SELECT DISTINCT identifier FROM LocalDb.schema.[TableName] 在两个表上,列上的都是非聚集索引identifier。本地大约有260万行,远程只有54行。但是,在查看查询计划时,70%的执行时间专用于“执行远程查询”。此外,在研究完整的查询计划时,将使用估计的本地行数1代替2695380(这是仅选择后面的查询时的估计行数EXCEPT)。 当执行此查询时,确实需要很长时间。 这让我感到奇怪:这是为什么?估算是“正确”的吗?还是在链接服务器上进行远程查询真的那么昂贵?

3
链接服务器风险
我正在实现一项新功能,该功能需要来自多台服务器上数据库的数据。我只需要合并所有这些服务器中的数据并对其进行排序。我想到的两个选择是: 使用链接的服务器并编写一个简单的查询,以对将在一台服务器上运行的数据进行合并和排序,并从另一台服务器收集数据。 使用应用程序从所有服务器收集数据,然后将其发送回SQL Server进行排序(不想在应用程序中实现排序)。 我们在SQL Server 2008 r2的活动/活动群集中运行服务器。所有数据库都具有相同的权限,如果您有权访问一个数据库/服务器,则对它们全部都具有权限。这是一个面向公众的应用程序(需要用户登录)。 使用链接服务器有哪些风险?我应该关注任何安全漏洞吗?在主动/主动群集中运行链接服务器是否有任何问题?与替代方案相比,会不会有任何重大的性能问题? 关于链接服务器,似乎普遍存在负面的“嗡嗡声”,但是我找不到任何具体的东西可以使我相信那里确实存在任何问题。


1
在数据库项目中将链接服务器与OPENQUERY一起使用
我有一个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 …

1
我应该对链接SQL Server有什么大的限制?
我们的产品基于Microsoft SQL Server。当前,我们正在使用三个数据库,并且始终将它们部署在一个SQL Server实例上。 这三个数据库是OLTP,OLAP和审计。OLAP数据库使用跨数据库查询,具有来自OLTP和审计的有关EOD的大量入站数据。 问题 如果我们要将这三个数据库部署到单个物理服务器内的三个单独的Standard Edition 实例上,并使用SQL Server的链接服务器功能将它们绑定在一起: 对应用程序代码的透明度如何?我应该期待多少变化? 到OLAP的入站数据总计为5万至10万行,每个EOD负载为200-500MB。我应该期望多少性能下降? 我还应该期待其他哪些重大限制? 背景 目前,我们正在为潜在的第一个客户提供500多个并发用户。 我们正在起草服务器规范,其中包括64个内核和256GB RAM。为了使SQL Server能够利用所有这些丰富的资源,客户端必须购买Enterprise Edition,而对于SQL Server 2016,Enterprise Edition仅在基于每核的许可中可用。 我们担心光是许可成本(64 x 7400美元)就会使他们失望。因此,我正在考虑将数据库分为Standard Edition的三个实例,并将它们链接在一起,希望链接功能对应用程序代码是透明的。

2
如何编写引用链接服务器的可移植SQL?
我有一个引用链接服务器的存储过程。在整个过程的几个地方,我都有类似以下内容: INSERT INTO [TableName] (...Columns...) SELECT ...Columns... FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName] WHERE TableNameID = @TableNameID 此过程存在于我的开发环境,测试环境和实时环境中。 问题在于该过程的每个副本都略有不同,因为每个环境的服务器名称都不同。这使得管理脚本更新的部署很麻烦。 有没有办法使该过程具有可移植性,以便每个环境都可以运行该过程的相同版本? 如果没有,我是否可以做些什么来使脚本部署不易出现错误/错误?

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.