我链接到Proficy Historian,它允许列名称中包含句点.因为数据以非DBMS格式存储,所以我不能openquery用来获取数据,因为表没有设置模式.所以我必须使用四部分名称语法来获取数据.这个例子有效:
SELECT * FROM iHist...[SELECT * FROM ihTrend]
Run Code Online (Sandbox Code Playgroud)
但是在'.'附近的语法不正确.
SELECT * FROM iHist...[SELECT [SERVER.pid_astatus[07][0].F_CV.Value] FROM ihTrend]
Run Code Online (Sandbox Code Playgroud)
SERVER.pid_astatus[07][0].F_CV.Value列的名称在哪里
这也与关键字'from'附近的语法错误一致.
SELECT * FROM
iHist...[SELECT [SERVER.pid_astatus[[07]][[0]].F_CV.Value] from ihTrend]`
Run Code Online (Sandbox Code Playgroud)
关于如何让SQL Server将其视为列的任何想法?
编辑:
Martins建议右括号转义括号只能在sql调用的外部工作
SELECT [SERVER.pid_astatus[07]][0]].F_CV.Value] FROM iHist...[SELECT * FROM ihTrend]
Run Code Online (Sandbox Code Playgroud)
但是它在关键字'from'附近的不正确语法中不起作用.
SELECT * FROM iHist...[SELECT [SERVER.pid_astatus[07]][0]].F_CV.Value] FROM ihTrend]
Run Code Online (Sandbox Code Playgroud)
编辑
SELECT * FROM iHist...[SELECT [SERVER.pid_astatus[07]][0]].F_CV.Value]] FROM ihTrend]
Run Code Online (Sandbox Code Playgroud)
我不得不逃脱列逃脱:)
尝试运行跨服务器更新:
UPDATE ASILIVE.CustomerManagementSystem.dbo.Sessions
SET ASILIVE.CustomerManagementSystem.dbo.Sessions.VarianceAmount=Variances.VarianceAmount
FROM ASILIVE.CustomerManagementSystem.dbo.Sessions
INNER JOIN Variances
ON ASILIVE.CustomerManagementSystem.dbo.Sessions.SessionGUID = Variances.SessionGUID
WHERE ASILIVE.CustomerManagementSystem.dbo.Sessions.VarianceAmount <> Variances.VarianceAmount
Run Code Online (Sandbox Code Playgroud)
给出错误:
Msg 117, Level 15, State 2, Line 5
The number name 'ASILIVE.CustomerManagementSystem.dbo.Sessions' contains
more than the maximum number of prefixes. The maximum is 3.
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
不重要的研究:
我试着随意别名s:
UPDATE ASILIVE.CustomerManagementSystem.dbo.Sessions s
SET s.VarianceAmount=Variances.VarianceAmount
FROM ASILIVE.CustomerManagementSystem.dbo.Sessions s
INNER JOIN Variances
ON s.SessionGUID = Variances.SessionGUID
WHERE s.VarianceAmount <> Variances.VarianceAmount
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
Msg 117, Level 15, …Run Code Online (Sandbox Code Playgroud) 我需要编写一个过程来从几个远程服务器收集数据,
我使用链接服务器和OPENQUERY从服务器收集数据,但有时我失去了与某些服务器的连接,或者我根本无法连接它们(例如远程服务器处于脱机状态) - 并且在这些情况下OPENQUERY会导致超时.
所以我想首先检查链接服务器连接,然后如果它成功运行查询,如果不是只是移动到下一个远程服务器.
我试图将OPENQUERY置于TRY - CATCH但它仍然返回我超时错误,sp_testlinkedserver程序也返回了我超时错误.
我真的很感激任何帮助.
链接一些 SQL Server 2008 服务器/实例后,我想对这些服务器进行更通用的查询。我知道我必须像这样指定查询的命运:
select *
from [SRV\INSTANCE].dbname.dbo.foo
Run Code Online (Sandbox Code Playgroud)
但是,我会针对多个链接服务器运行此查询。我也知道这个 select 语句返回的正是SRV\INSTANCE我需要的:
select ss.name
from sys.servers ss
where ss.server_id > 0
Run Code Online (Sandbox Code Playgroud)
这个,servers\instances从我想要查询的地方返回所有内容。
在这种情况下,所有数据库都具有相同的结构,所以我想做这样的事情:
select *
from [select ss.name from sys.servers ss where ss.server_id > 0].DBNAME.dbo.foo
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
提前致谢。
我在使用链接服务器的DB加入本地数据库时遇到任何问题.
我的查询:
SELECT
[LocalDatabase].[dbo].[Record].[Project_ID],
[LinkedServer].[Reporting].[dbo].[Active].[Name]
FROM [LocalDatabase].[dbo].[Record] inner join
[LinkedServer].[Reporting].[dbo].[Active] ON
[LocalDatabase].[dbo].[Record].[Project_ID] = [LinkedServer].[Reporting].[dbo].[Active].[Delivery_Number]
Run Code Online (Sandbox Code Playgroud)
错误:
Msg 4104, Level 16, State 1, Line 9
The multi-part identifier "LinkedServer.Reporting.dbo.Active.Delivery_Number" could not be bound.
Msg 4104, Level 16, State 1, Line 5
The multi-part identifier "LinkedServer.Reporting.dbo.Active.Name" could not be bound.
Run Code Online (Sandbox Code Playgroud)
我猜我的语法不正确,但我无法修复它.有人可以建议一个解决方案?
如果有更好的解决方案让我在不同服务器上的2个数据库上运行select查询,请提及它.
我即将将我的 SQL Server 2012 实例升级到 SQL Server 2014。
我已经克隆了主机的Windows虚拟机,并从它改名foo-2012到foo-2014。重新启动时,SQL Server 实例注意到它更新了自己的名称,因此我现在可以以foo-2014. 都好。
不幸的是,(单个)条目sys.servers仍然是foo-2012这意味着运行
SELECT *
FROM [foo-2012].[barDB].[dbo].tFooBarTable
Run Code Online (Sandbox Code Playgroud)
失败:
在 sys.servers 中找不到服务器“RW-DB-2014”。验证是否指定了正确的服务器名称。如有必要,请执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。
美好的。
我运行EXEC sp_addlinkedserver 'foo-2014', 'SQL Server'并获得一个条目。
但是现在新条目具有isLinked=1(而现有条目具有isLinked=0)。
文档表明此设置很重要(特别是对于我的应用程序,它对 Distr.Trans 有很强的意见。:()
我无法直接编辑/添加/修改 sys.servers。任何这样做的尝试都会给出:
不允许对系统目录进行临时更新。
我删除了EXEC sp_dropserver 'foo-2014'成功的新条目 ( ),并尝试使用EXEC sp_addserver 'foo-2014', 'local'which 报告
服务器 'foo-2014' 已经存在
立即重新运行 drop 然后报告
服务器“RW-DB-2014”不存在。使用 sp_helpserver 显示可用的服务器。
我该如何解决?
我已经设置了一个指向Oracle DB的链接服务器.我想在包XYZ传递参数K中调用函数ABC.这样做的语法是什么?
我已经使用sp_addlinkedserver访问远程机器db现在我在数据库上显式编写查询,如,
从[server\instance] .database.owner.tablename中选择*
有了这个,
如果使用查询我们是否需要使用EXEC发现这些值()来执行,否则我们仍然可以使用nice查询实现的呢?
谢谢大家,
我有一个在服务器上运行的sql脚本(ServerA)这个服务器有一个链接服务器设置(ServerB) - 它位于数据中心的站点外.
此查询相对较为有效:
SELECT OrderID
FROM [ServerB].[DBName].[dbo].[MyTable]
WHERE Transferred = 0
Run Code Online (Sandbox Code Playgroud)
但是,使用此查询更新同一个表时:
UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1
Run Code Online (Sandbox Code Playgroud)
完成需要> 1分钟(即使只有1列Transferred = 0)
有什么理由会这么慢吗?我应该在MyTable上为"已转移"列添加索引吗?
linked-server ×10
sql-server ×7
sql ×6
t-sql ×2
connection ×1
historian ×1
jobs ×1
multiserver ×1
openquery ×1
oracle ×1
rename ×1