Запрос удаленной базы данных с использованием сервера SQL? - PullRequest
3 голосов
/ 27 февраля 2010

Я использовал sp_addlinkedserver для доступа к удаленным машинам. Теперь я пишу запросы к базе данных, например,

выберите * из [server \ instance] .database.owner.tablename

Теперь с этим,

  1. [Сервер \ экземпляр]: это должно быть предоставлено явно
  2. [база данных]: можем ли мы найти базы данных в указанном экземпляре, используя запрос типа ms_ForEachDB?
  3. [владелец]: Можем ли мы найти имя владельца базы данных с помощью запроса?

Если эти значения найдены с помощью запросов, нужно ли нам использовать EXEC () для выполнения этого или мы все еще можем достичь этого с помощью хороших запросов?

Спасибо всем,

Ответы [ 4 ]

7 голосов
/ 28 февраля 2010

Упоминаемый вами "хороший" формат - это просто ссылка на объект из 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

Однако, изменение компонентов ссылки на объект не имеет смысла: если вы знаете, что собираетесь запросить таблицу, просто вызовите эту таблицу в этой базе данных ...

2 голосов
/ 27 февраля 2010

Вы должны создать строку запроса и затем запустить ее с помощью функции exec().

получение имени сервера:

SELECT @@SERVERNAME

получение текущего имени БД:

SELECT DB_NAME() AS DataBaseName
0 голосов
/ 27 сентября 2016

Если случается, что вам нужно использовать в своих аргументах какую-то переменную (например, собирать обновления сервера удаленного компьютера со вчерашнего дня):

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

______

Где:

database.targetTable : По какой-то причине SSMS 2008 R2 возвращает ошибку, если вы описываете ее как [база данных]. [TargetTable], и ​​я не знаю, почему это происходит.

@ вчера : переменная, которую вы хотите вставить (в данном случае строка, содержащая элемент, похожий на дату и время)

PRINT @ sql : Просто для проверки правильности расстановки кавычек.

columnWithDateTime : Должен быть столбец с форматом datetime (например, "отметка времени" или аналогично формату переменной @чера .

"OPENQUERY не принимает переменные для своих аргументов.": См. Здесь (MSDN: OPENQUERY (Transact-SQL)).

0 голосов
/ 01 марта 2010

Вам не нужно использовать EXEC, вы можете использовать что-то вроде select * from openquery(MyLinkedServer,@sql) Хотя я предпочитаю EXEC(@sql) AT MyLinkedServer

Но все работают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...