4

I have used sp_addlinkedserver to access the remote machines db now i am writing queries explicitly on database like,

select * from [server\instance].database.owner.tablename

Now with this,

  1. [Server\instance] : this has to be provided explicitly
  2. [database] : can we find databases on specified instance using query like ms_ForEachDB ?
  3. [owner] : Can we find the database owner name using query ?

If these values are found using queries do we need to use EXEC() to execute this or we can still achieve it using nice queries ?

Thanks all,

4 Answers 4

8

The "nice" format you mention is simply a 4 part object reference.

select * from [server\instance].database.owner.tablename

3 part

select * from database.owner.tablename

2 part

select * from owner.tablename

If you want to dynamically change any of the server, db or schema values then you have one option:

EXEC (@sqlstring)

However, if you only access stored procs remotely...

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

However, changing the components of the object reference makes no sense arguably: if you know you're going to query a table then just call that table in that database...

Sign up to request clarification or add additional context in comments.

1 Comment

Do I need linked server to run such query?
2

you should make a query string and then run it by exec() function.

getting server name :

SELECT @@SERVERNAME

getting current db name :

SELECT DB_NAME() AS DataBaseName

Comments

0

You do not have to use EXEC you could use something like select * from openquery(MyLinkedServer,@sql) THough i prefer EXEC(@sql) AT MyLinkedServer

But all work

Comments

0

If it happens that you need to use some sort of variable in your arguments(e.g. collect remote's server updates since yesterday):

DECLARE @yesterday NVARCHAR(20) = '2016-09-23 08:16:20';
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM database.targetTable AS origin
                          WHERE origin.columnWithDateTime >'''+@yesterday+''';';
PRINT @sql;
EXEC(@sql) AT linkedServer

______

Where:

database.targetTable : For some reason SSMS 2008 R2 returns error if you describe it as [database].[targetTable], and i don't know why that happens.

@yesterday: Is the variable you want to insert (this case, a string containing datetime-like element)

PRINT @sql: Just to verify if the quotes are correctly placed.

columnWithDateTime: Should be a column with datetime format (e.g. "timestamp", or similar to the @yesterday variable format.

"OPENQUERY does not accept variables for its arguments.": See Here (MSDN: OPENQUERY (Transact-SQL)).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.