我需要编写一个过程来从几个远程服务器收集数据,
我使用链接服务器和OPENQUERY从服务器收集数据,但有时我失去了与某些服务器的连接,或者我根本无法连接它们(例如远程服务器处于脱机状态) - 并且在这些情况下OPENQUERY会导致超时.
所以我想首先检查链接服务器连接,然后如果它成功运行查询,如果不是只是移动到下一个远程服务器.
我试图将OPENQUERY置于TRY - CATCH但它仍然返回我超时错误,sp_testlinkedserver程序也返回了我超时错误.
我真的很感激任何帮助.
我是 SQL Server 的新手,我在这里偶然发现了这一点:
BEGIN TRANSACTION loadTTAllocations
INSERT INTO @ttaAllocs
SELECT
company_code AS CompanyId,
job_number AS JobNo,
...
is_blocked AS IsBlocked
FROM
OPENQUERY([SRV_TimeTac],
'SELECT DISTINCT
job.individual_value_1 AS job_number,
job.individual_value_3 AS company_code,
...
now() AS queryTimeStamp
FROM
pm_altran.pm_tasks_subprojects AS taskCode
INNER JOIN
pm_altran.pm_tasks_subprojects AS job
ON job.id = taskCode.mother_id
AND job.is_done = 0
AND NOT job.is_blocked
INNER JOIN
pm_node_to_user AS n2u
ON n2u.node_id = taskCode.id
AND n2u.access = 1
AND n2u.is_todo = 1
LEFT JOIN
altran_pm_user_user_settings AS u
ON u.administrators_id = …Run Code Online (Sandbox Code Playgroud) 我有许多与此结构类似的存储过程:
DECLARE @sql NVARCHAR(MAX)
DECLARE @mdx NVARCHAR(MAX)
CREATE table #result
(
[col1] NVARCHAR(50),
[col2] INT,
[col3] INT
)
SET @mdx = '{some dynamic MDX}'
SET @sql = 'SELECT a.* FROM OpenQuery(LinkedAnalysisServer, ''' + @mdx + ''') AS a'
INSERT INTO #result
EXEC sp_executesql @sql
SELECT * FROM #result
Run Code Online (Sandbox Code Playgroud)
当多维数据集中存在结果时,这非常有效。但是,当 OpenQuery 结果为空时,INSERT 会失败并显示以下错误:
列名或提供的值数量与表定义不匹配。
我的问题是,处理这种情况的最佳方法是什么?我在静态报告文件 (.rdlc) 中使用结果,因此(我很确定)需要显式键入临时表。
我正在尝试将表从MySql迁移到MSSQL,openquery但我不断收到以下错误消息:
OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "Requested conversion is not supported.".
Msg 7341, Level 16, State 2, Line 1
Cannot get the current row value of column "[MSDASQL].description" from OLE DB provider "MSDASQL" for linked server "MYSQL".
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行的SQL查询:
insert into dbo.tickets (id, description, createdAt)
select * from openquery(MYSQL, 'select * from mydb.tickets')
Run Code Online (Sandbox Code Playgroud)
随着openquery我已经复制了几个表,但这个招数我.
在数据库的两边,description字段是varchar(8000).在MySql中没有描述为null的行,最长的描述只有5031个字符.
我尝试使用相同的数据结构在MySql中创建一个新视图,但是得到了相同的错误.我无法确定哪一行具有无效的描述字段,因为该表包含超过65000行.
我也尝试将数据转储到SQL文件中,但我进入OutOfMemoryException了Management Studio.转储的sql文件本身大约是60 MB.
有关迁移此数据的任何建议或其他方式吗?
提前致谢!
我有两台服务器:SQLSERVER01并且SQLSERVER02我正在尝试更新来自SERVER01(SERVER02是SERVER01链接服务器)的数据。
我的更新查询当前是动态的,看起来像这样
DECLARE @SQL NVARCHAR(MAX)
DECLARE @ID INT
SET @ID = 1
Set @SQL = 'Update SERVER01.MyDatbase.dbo.MyTable
set ModifiedDate = GetDate(), SomeOtherValue = ''xyz''
Where Id = ' Convert(varchar(10), @ID)
Run Code Online (Sandbox Code Playgroud)
如果我现在打电话
EXEC(@SQL)
Run Code Online (Sandbox Code Playgroud)
它有时会起作用,但有时它会挂在那里很长时间,当我跑步时sp_active我会看到PREEMPTIVE_OLEDBOPS。
所以,我然后尝试使用开放查询,如下所示
Select *
From OpenQuery(SERVER01,
'Update SERVER01.MyDatbase.dbo.MyTable
set ModifiedDate = GetDate(), SomeOtherValue = ''xyz''
Where Id = 1')
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
链接服务器“SERVER01”的 OLE DB 提供程序“SQLNCLI11”指示该对象没有列,或者当前用户对该对象没有权限。
当我运行以下选择查询时,我成功返回了我尝试更新的行:
Select *
From OpenQuery(SERVER01,
'Select *
From SERVER01.MyDatbase.dbo.MyTable
Where …Run Code Online (Sandbox Code Playgroud) 我们有一个MS SQL Server 2005安装,它通过链接服务器连接连接到Oracle数据库。
许多 SELECT 语句是通过一系列OPENQUERY()命令执行的。大多数这些语句中的 WHERE 子句都是针对VARCHAR列的。
我听说如果 WHERE 子句区分大小写,它会对性能产生很大影响。
所以我的问题是,如何确保以不区分大小写的方式执行非二进制字符串 WHERE 子句以获得最大性能?
我需要帮助编写将从SQL服务器更新MySql表的查询.我创建了链接服务器和选择查询工作正常但我在更新时遇到错误.我真的很想写这种类型的查询,所以请帮助我理解错误信息及其含义.
我的更新查询:
UPDATE openquery(stagedb_za, 'Select acm_flag FROM aol_center WHERE nid = 6439')
Set acm_flag = 'P'
Run Code Online (Sandbox Code Playgroud)
错误:
用于链接服务器"stagedb_za"的OLE DB提供程序"MSDASQL"返回消息"无法找到行以进行更新.某些值自上次读取后可能已更改.".消息7343,级别16,状态4,行1链接服务器的OLE DB提供程序"MSDASQL"无法更新表"[MSDASQL]".行集使用了乐观并发,并且在上次提取或重新同步包含行之后,列的值已更改.
我正在尝试从表中读取数据。这个表有一个表名列表。
对于数据集的每一行,我想运行几个查询来提取数据并将其插入到临时表中。
这是我所做的
DECLARE @campName varchar(255);
DECLARE @sqlCommand varchar(1000);
DECLARE @sqlCommandMySQL varchar(1000);
DECLARE @LastRun varchar(60);
DECLARE @OPENQUERY varchar(1000);
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT LTRIM(RTRIM(CallListName)) AS CallListName
FROM [SMSQL1].[RDI_System].[dbo].[Campaigns]
WHERE dialer_campaign = 1 AND i3Server ='I3New' AND ClientID = 111 AND (EndDate IS NULL OR EndDate >= getdate() - 7)
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @campName
WHILE @@FETCH_STATUS = 0
BEGIN
--SET @LinkedServer = 'GUARDIAN';
SET @OPENQUERY = 'SELECT @LastRun = lr FROM OPENQUERY(GUARDIAN,''';
SET …Run Code Online (Sandbox Code Playgroud) 我们有一个 Oracle 数据库,可以通过 OpenQuery 访问该数据库以获取某些内容。显然,您无法使用 OleDB 驱动程序直接在 OpenQuery 中进行日期比较,因此要解决此问题,您必须将日期转换为 Julien 日期并比较这些数字。我有以下查询,我们尝试在 MS SQL Server 中执行此查询(GPROD 是通过 OleDb 驱动程序的链接服务器):
SELECT *
FROM OPENQUERY(GPROD, '
SELECT *
FROM ORD_HDR_HST
WHERE (cast(to_number(to_char(SHIP_DATE ,''J'')) as numeric(10,0)) >= cast(to_number(to_char(to_date(''01-JAN-2015'') ,''J'')) as numeric(10,0)) AND
cast(to_number(to_char(SHIP_DATE ,''J'')) as numeric(10,0)) <= cast(to_number(to_char(to_date(''21-SEP-2015'') ,''J'')) as numeric(10,0)) )')
Run Code Online (Sandbox Code Playgroud)
此查询不返回结果,但也不会产生错误。
如果我在 Oracle SQL Developer 中执行此查询,它会正常工作并返回数千行:
SELECT *
FROM ORD_HDR_HST
WHERE (cast(to_number(to_char(SHIP_DATE ,'J')) as numeric(10,0)) >= cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) AND
cast(to_number(to_char(SHIP_DATE ,'J')) as numeric(10,0)) <= cast(to_number(to_char(to_date('21-SEP-2015') ,'J')) as numeric(10,0)) )
Run Code Online (Sandbox Code Playgroud)
该 …
我正在创建视图,但在此之前我正在测试和使用多个链接服务器在 select union 语句中返回列值,我使用以下简单代码:
SELECT * FROM OPENQUERY ([linkedserver1],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
UNION ALL
SELECT * FROM OPENQUERY ([linkedserver2],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
UNION ALL
SELECT * FROM OPENQUERY ([linkedserver3],'SELECT TOP 1 [Column1], [Column2] FROM [db].[table]')
Run Code Online (Sandbox Code Playgroud)
它按预期返回以下结果:
|Column1|Column2|
| 001 | Pass |
| 010 | Pass |
| 100 | Pass |
Run Code Online (Sandbox Code Playgroud)
但我的问题在于,当其中一个链接服务器离线时(例如 [ linkedserver2 ]),没有显示任何结果,我只得到:
OLE DB provider "SQLNCLI11" for linked server "[linkedserver2]" returned
message "Login timeout expired".
OLE DB provider "SQLNCLI11" for …Run Code Online (Sandbox Code Playgroud) openquery ×10
sql-server ×7
sql ×3
t-sql ×3
mysql ×2
oracle ×2
connection ×1
date ×1
dynamic-sql ×1
odbc ×1
scalar ×1
sql-update ×1
ssas ×1