我已经使用sp_addlinkedserver来访问远程机器db现在我在数据库上显式编写查询,如
从[server \ instance] .database.owner.tablename
中选择*现在有了这个,
如果使用查询找到这些值,我们是否需要使用EXEC()来执行此操作,或者我们仍然可以使用不错的查询来实现它?
全心全意,
答案 0 :(得分:7)
您提到的“漂亮”格式只是一个4部分的对象引用。
select * from [server\instance].database.owner.tablename
3部分
select * from database.owner.tablename
2部分
select * from owner.tablename
如果要动态更改任何服务器,数据库或模式值,则可以选择一个选项:
EXEC (@sqlstring)
但是,如果您只是远程访问存储过程......
DECLARE @RemoteSP varchar(500)
SET @RemoteSP = '[server\instance].database2.schema.proc2'
EXEC @RemoteSP @p1, @p2, @p3 OUTPUT
SET @RemoteSP = '[server\instance].database1.schema.proc1'
EXEC @RemoteSP @p4, @p5, @p6 OUTPUT
然而,更改对象引用的组件毫无意义:如果您知道要查询表,那么只需在该数据库中调用该表...
答案 1 :(得分:2)
你应该创建一个查询字符串,然后通过exec()
函数运行它。
获取服务器名称:
SELECT @@SERVERNAME
获取当前的数据库名称:
SELECT DB_NAME() AS DataBaseName
答案 2 :(得分:0)
您不必使用EXEC
您可以使用select * from openquery(MyLinkedServer,@sql)
之类的东西,我更喜欢EXEC(@sql) AT MyLinkedServer
但所有的工作
答案 3 :(得分:0)
如果您需要在参数中使用某种变量(例如,从昨天开始收集远程服务器更新):
bool empty() const
{
return size() == 0 ;
}
______
地点:
database.targetTable :出于某种原因,如果您将SSMS 2008 R2描述为[数据库]。[targetTable],则会返回错误,并且我不知道为什么会发生这种情况。
@yesterday :是否要插入变量(这种情况下,包含类似日期时间的元素的字符串)
PRINT @sql :只是为了验证是否正确放置了引号。
columnWithDateTime :应该是具有 datetime 格式的列(例如"时间戳",或类似于 @yesterday 变量格式。
" OPENQUERY不接受其参数的变量。":See Here(MSDN:OPENQUERY(Transact-SQL))。