标签: openquery

包括OPENQUERY中的参数

如何在sql openquery中使用参数,例如:

SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME
where field1=@someParameter') T1 INNER JOIN MYSQLSERVER.DATABASE.DBO.TABLENAME
T2 ON T1.PK = T2.PK
Run Code Online (Sandbox Code Playgroud)

sql parameters openquery

79
推荐指数
4
解决办法
26万
查看次数

什么是MS SQL Server中的"INSERT IGNORE"等价物?

我试图使用"OPENQUERY"从MS SQL Server将记录插入MySQL数据库,但我想要做的是忽略重复的密钥消息.因此,当查询遇到重复时,请忽略它并继续.

我可以做些什么来忽略重复?

这是我在做的事情:

  1. 使用"OpenQuery"从MySQL中提取记录来定义MySQL"A.record_id"
  2. 从这里将这些记录连接到MS SQL Server中的记录"具有特定条件而不是直接id"我在SQL Server中找到了一个新的相关"B.new_id"记录标识符.
  3. 我想将找到的结果插入到MySQL的新表中,如同A.record_id,B.new_id在新表中,我将A.record_id设置为该表的主键.

问题是,当将表A连接到表B时,有时我会在表B中找到2条以上的记录,这些记录与我要查找的条件相匹配,这会导致我的数据集中的值A.record_id超过2倍,然后将其插入表A中这导致了问题.注意我可以使用聚合函数来消除记录.

mysql sql-server openquery sql-insert

15
推荐指数
2
解决办法
3万
查看次数

使用变量vs literal时远程查询很慢

我已经到处搜索这种情况,除了动态SQL之外找不到解决方案,我不想使用它.

这是我想在服务器2上更新的表:

(Stuff Id UNIQUEIDENTIFIER
, stuffname NVARCHAR(64))
Run Code Online (Sandbox Code Playgroud)

我需要从服务器1更新它.

所以我一直在尝试这个:

DECLARE @newstuff nvarchar(64)

SELECT @newstuff = 'new stuff'

UPDATE [server2].database2.dbo.Stuff
SET stuffname=@newstuff
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'
Run Code Online (Sandbox Code Playgroud)

这需要11秒.下一个使用文字在1秒内运行

UPDATE [server2].database2.dbo.Stuff
SET stuffname='new stuff'
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'
Run Code Online (Sandbox Code Playgroud)

我比较了实际的执行计划.速度较慢的是远程扫描需要100%的成本,另外还有5个其他步骤(过滤器,表假脱机,计算标量,远程更新,更新).快速的只是执行UPDATE和远程查询步骤.我需要使用变量,所以我需要一种方法来强制它远程执行整个查询.

我尝试过使用OPTION(RECOMPILE)但是server1正在使用SQL Server 2005.server2正在使用SQL Server 2012.我无法在服务器2上更改数据库结构而不会出现严重问题.我没有任何身份验证问题.我在更新时尝试对表进行别名.

我也尝试过使用Openquery.当我将id过滤器放在查询字符串中时,它会回落到1秒以下:

UPDATE OPENQUERY([server2], 'select stuffname, stuffid from database2.dbo.stufftable where contactid=''4CA1D489-9221-E511-A441-005056C00008''')
SET stuffname = @newstuff
Run Code Online (Sandbox Code Playgroud)

但是我需要id也是一个变量,而open查询不需要变量(https://msdn.microsoft.com/en-CA/library/ms188427.aspx).我尝试使用查询外部的id过滤器运行Openquery,但是在4秒内运行.它比11好,但不是很好:

UPDATE OPENQUERY([server2],'select stuffname, stuffid from database2.dbo.stufftable')
set stuffname=@newstuff
where contactid='4CA1D489-9221-E511-A441-005056C00008'
Run Code Online (Sandbox Code Playgroud)

当然,我使用exec(@sql)运行openquery,但我真的不想这样做.我可以使用文字来完成整个更新语句,甚至不使用OPENQUERY并获得相同类型的结果.

有没有办法让我在不使用exec(@sql)的情况下修复此性能?

sql sql-server sql-server-2005 openquery sql-update

13
推荐指数
1
解决办法
1407
查看次数

在SQL Server中远程调用表值函数的解决方法存在更多问题

我有一组查询需要使用不同的参数多次运行,所以我把它包装在一个表值函数中.

需要从远程服务器调用该表值函数.不幸的是,链接服务器上的调用失败并出现错误:

Msg 4122, Level 16, State 1, Line 29
Remote table-valued function calls are not allowed.
Run Code Online (Sandbox Code Playgroud)

Microsoft已承认"远程调用表值函数"是SQL Server 2008中遗漏的一项功能.请参阅:http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function -calls-是-不被允许

我发现了一种使用OPENQUERY语法的解决方法,它允许查询在远程服务器上本地运行,然后返回结果集.请参阅:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd

不幸的是,这个解决方法需要一个解决方法,因为它需要一个字符串作为参数,这意味着你不能使用OPENQUERY语法传递一个变量,你甚至不能在其中连接一个字符串,就像你想要包含你的变量一样想要传递给远程表值函数.解决方法的解决方法是使用动态SQL显式构建OPENQUERY查询,确保将正常的字符串传递给它.请参阅:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/

然而,另一个问题是由此产生的.即使确保所有引号和双引号和四引号都正确嵌入,因此整个事件可以通过exec sp_executesql传递,但仍然存在问题:

当查询最终调用表值函数时,我得到错误:

OLE DB provider "SQLNCLI10" for linked server "MY_REMOTE_SERVER_NAME" returned message "Deferred prepare could not be completed.".
Msg 7416, Level 16, State 1, Procedure MyTableValuedFunctionName, Line 22
Access to the remote server is denied because no login-mapping exists.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我收到此错误,因为我的用户名存在映射,如果我只是用实际表替换表值函数,它会返回结果.OPENQUERY语句出现问题,无论是否使用sp_executesql执行,并且正如我所说,它只在调用表值函数时发生.

任何想法如何解决这个问题?

permissions linked-server openquery sql-server-2008 sp-executesql

12
推荐指数
1
解决办法
3万
查看次数

SELECT*FROM MySQL链接服务器使用SQL Server而不使用OpenQuery

我正在尝试使用查询MySQL链接服务器SQL Server.

以下查询运行正常.

SELECT * FROM OPENQUERY([Linked_Server], 'SELECT * FROM Table_Name')
Run Code Online (Sandbox Code Playgroud)

是否可以在不使用OpenQuery调用的情况下运行相同的查询?

mysql sql-server linked-server openquery

12
推荐指数
5
解决办法
3万
查看次数

连接到链接服务器时查询速度慢

我有这个问题

UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'

这需要23秒来选择和更新一行

但是如果我使用openquery(我不想这样做)那么它只需要半秒钟.

我不想使用openquery的原因是我可以安全地为我的查询添加参数,并且可以安全地进行SQL注入.

有谁知道它运行这么慢的任何原因?

sql sql-server asp.net linked-server openquery

8
推荐指数
1
解决办法
3681
查看次数

MySQL链接服务器无法更新longtext

我有一个从SQL Server到mySQL数据库的链接服务器(使用MySQL ODBC Driver 5.3的Windows Server).我有一个独特的情况,如果我在OPEN QUERY中转换它们,我只能返回我的longtext列:

SELECT * 
FROM
OPENQUERY (woocommerce, 'SELECT meta_id, CONVERT(meta_value using UTF8) as meta_value
                         FROM woocommerce.wp_postmeta WHERE meta_id = 9465078') 
Run Code Online (Sandbox Code Playgroud)

如果我不转换/转换它我从链接服务器收到以下错误:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "woocommerce" reported an error. The provider reported an unexpected catastrophic failure.
Run Code Online (Sandbox Code Playgroud)

我需要更新这个longtext列,"meta_value",但我不能,因为它已被转换/转换.

    UPDATE 
    OPENQUERY (woocommerce, 'SELECT meta_id, CONVERT(meta_value using utf8) 
                             FROM woocommerce.wp_postmeta WHERE meta_id = 9465078') 
    SET meta_value = 'outofstock';
Run Code Online (Sandbox Code Playgroud)

有没有办法使用OPENQUERY和链接服务器更新已转换/转换列?我尝试过转换或转换它的方式.

mysql linked-server openquery

8
推荐指数
1
解决办法
305
查看次数

使用OPENQUERY(exec存储过程)创建新的临时表失败,错误11526

我在我的开发PC上安装了SQL Server 2012完整版.

我试图按照这里的示例进行操作,其中显示了如何使用存储过程作为数据源创建新的临时表.我试图将几个存储过程的结果合并到一个临时表中(各种结果集的列结构/定义是相同的).

要测试管道是否正常工作,我发出以下查询:

 SELECT * FROM OPENQUERY("FOO\SQL2012", 'exec mySchema.myStoredProc')
Run Code Online (Sandbox Code Playgroud)

但是我从这个简单的测试管道选择查询中得到了这个错误:

消息11526,级别16,状态1,过程sp_describe_first_result_set,第1行
无法确定元数据,因为语句'insert #tmp(foo1,foo2,foo3)选择'O'作为foo1,foo2,foo3'在过程'myStoredProc'中使用临时表.

如果我正确理解错误,OPENQUERY依赖于服务器能够从数据库中的持久定义中提取列数据类型,并且在我的存储过程中实例化的临时表是短暂的,缺少持久定义.如果是这种情况,是否有任何设置告诉OPENQUERY尽其所能并尝试对列数据类型进行智能猜测?

这是我正在测试的虚拟SP:

create proc testproc
as
begin

create table #test
(id int, name varchar(5) );

insert into #test(id,name)values(1,'xxx');
select * from #test;
--drop table #test;   -- tried dropping and not dropping, same error either way
end
Run Code Online (Sandbox Code Playgroud)

metadata openquery sql-server-2012

7
推荐指数
2
解决办法
2万
查看次数

OpenRowSet,OpenQuery,OpenDataSource - 在性能方面更好

这可能是一个值得商榷的答案,但我正在寻找需要将本地Excel文件导出到本地SQL Server 2008表的情况.

有没有人有机会检查执行时间来比较OpenRowSet/OpenQuery/OpenDataSource在SQL Server 2008中进行非常大的文件导入?

我可以使用3个选项中的任何一个,并且可以从任何地方执行查询.但是,数据源(Excel)与SQL Server位于同一服务器中.

任何指针都会有所帮助.

performance openquery openrowset

6
推荐指数
1
解决办法
1736
查看次数

使用本地表中的数据插入链接服务器上的表

我正在使用 SQL Server Express,我创建了一个到 Oracle 数据库的链接服务器。

正如标题所示,我想将从本地表中选择的数据插入到链接服务器上的表中。

我尝试了很多查询,但没有一个能按我想要的方式工作。

我使用的下面的查询有效,但仅适用于静态值,但我想从本地数据库上的表动态插入数据。

INSERT OPENQUERY (ORTEST, 'SELECT * FROM reservation')
VALUES (2, '2', 3);
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server oracle linked-server openquery

6
推荐指数
2
解决办法
1万
查看次数