如何在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) 我试图使用"OPENQUERY"从MS SQL Server将记录插入MySQL数据库,但我想要做的是忽略重复的密钥消息.因此,当查询遇到重复时,请忽略它并继续.
我可以做些什么来忽略重复?
这是我在做的事情:
问题是,当将表A连接到表B时,有时我会在表B中找到2条以上的记录,这些记录与我要查找的条件相匹配,这会导致我的数据集中的值A.record_id超过2倍,然后将其插入表A中这导致了问题.注意我可以使用聚合函数来消除记录.
我已经到处搜索这种情况,除了动态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)的情况下修复此性能?
我有一组查询需要使用不同的参数多次运行,所以我把它包装在一个表值函数中.
需要从远程服务器调用该表值函数.不幸的是,链接服务器上的调用失败并出现错误:
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
我正在尝试使用查询MySQL链接服务器SQL Server.
以下查询运行正常.
SELECT * FROM OPENQUERY([Linked_Server], 'SELECT * FROM Table_Name')
Run Code Online (Sandbox Code Playgroud)
是否可以在不使用OpenQuery调用的情况下运行相同的查询?
我有这个问题
UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'
这需要23秒来选择和更新一行
但是如果我使用openquery(我不想这样做)那么它只需要半秒钟.
我不想使用openquery的原因是我可以安全地为我的查询添加参数,并且可以安全地进行SQL注入.
有谁知道它运行这么慢的任何原因?
我有一个从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和链接服务器更新已转换/转换列?我尝试过转换或转换它的方式.
我在我的开发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) 这可能是一个值得商榷的答案,但我正在寻找需要将本地Excel文件导出到本地SQL Server 2008表的情况.
有没有人有机会检查执行时间来比较OpenRowSet/OpenQuery/OpenDataSource在SQL Server 2008中进行非常大的文件导入?
我可以使用3个选项中的任何一个,并且可以从任何地方执行查询.但是,数据源(Excel)与SQL Server位于同一服务器中.
任何指针都会有所帮助.
我正在使用 SQL Server Express,我创建了一个到 Oracle 数据库的链接服务器。
正如标题所示,我想将从本地表中选择的数据插入到链接服务器上的表中。
我尝试了很多查询,但没有一个能按我想要的方式工作。
我使用的下面的查询有效,但仅适用于静态值,但我想从本地数据库上的表动态插入数据。
INSERT OPENQUERY (ORTEST, 'SELECT * FROM reservation')
VALUES (2, '2', 3);
Run Code Online (Sandbox Code Playgroud) openquery ×10
sql-server ×5
mysql ×3
sql ×3
asp.net ×1
metadata ×1
openrowset ×1
oracle ×1
parameters ×1
performance ×1
permissions ×1
sql-insert ×1
sql-update ×1
t-sql ×1