Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Путь к таблицам как переменная  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
Здравствуйте!

Пусть есть такой простой SQL-запрос. Этот запрос запускается через сервер, который обращается либо одному прилинкованному серверу, либо к другому. Но названия баз данных одинаковые на этих прилинкованных серверах. В запросах используется полный путь к таблицам.
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	Server1.БазаДанных1.dbo.Таблица1 Таблица1

Выделенную строку нужно сделать как переменную.

Declare @ПолныйПуть varchar (100)='Server1.БазаДанных1.dbo'
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	@ПолныйПуть.Таблица1 Таблица1

Понятно, что этот запрос не рабочий.

Ка правильно написать запрос?
3 мар 18, 13:54    [21234674]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
aleks222
Guest
Правильно - обеспечить ОДИНАКОВЫЕ имена на всех серверах.

View или Synonym те в кривые ручки.
3 мар 18, 14:40    [21234747]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
aleks222
Правильно - обеспечить ОДИНАКОВЫЕ имена на всех серверах

Имена таблиц на разных серверах одинаковые, а имена серверов разные.
3 мар 18, 20:23    [21235189]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
aleks222
View или Synonym

А как в запросе писать?
3 мар 18, 20:24    [21235191]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
ferzmikk
Имена таблиц на разных серверах одинаковые, а имена серверов разные.

Ваша задача решается только динамическим запросом.
3 мар 18, 21:07    [21235239]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
ferzmikk
Member

Откуда:
Сообщений: 2031
Klick
ferzmikk
Имена таблиц на разных серверах одинаковые, а имена серверов разные.

Ваша задача решается только динамическим запросом.

Вот и поэтому я хочу написать такой запрос, чтобы в параметре указывал имя сервера.
3 мар 18, 21:25    [21235261]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Oomel
Member

Откуда:
Сообщений: 22
DECLARE @QUERY NVARCHAR(1000), @SCHEMA NVARCHAR(50);

SET @SCHEMA = N'Server1.БазаДанных1.dbo';

SET @QUERY = N'SELECT FIELD1, FIELD2, FIELD3 FROM ' +  @SCHEMA + '.TABLE1';

EXEC SP_EXECUTE @QUERY;


Полагаю, что-то подобное.
5 мар 18, 08:04    [21236755]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
лолл
Member

Откуда:
Сообщений: 450
ferzmikk,

CREATE SYNONYM dbo.Таблица1 FOR Server1.БазаДанных1.dbo.Таблица1 


соответственно, синонимы указывают на разные серверы в разных базах, но имеют одинаковые наименования
5 мар 18, 14:10    [21237771]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
ferzmikk
Здравствуйте!

Пусть есть такой простой SQL-запрос. Этот запрос запускается через сервер, который обращается либо одному прилинкованному серверу, либо к другому. Но названия баз данных одинаковые на этих прилинкованных серверах. В запросах используется полный путь к таблицам.
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	Server1.БазаДанных1.dbo.Таблица1 Таблица1

Выделенную строку нужно сделать как переменную.

Declare @ПолныйПуть varchar (100)='Server1.БазаДанных1.dbo'
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	@ПолныйПуть.Таблица1 Таблица1

Понятно, что этот запрос не рабочий.

Ка правильно написать запрос?

Можно с извращениями :)
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM openquery(linked server сам на себя с одинаковым названием на всех серверах, 'select нужные_столбцы from база.dbo.таблица')
5 мар 18, 14:14    [21237793]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,

Это если справедливо утверждение автора темы "Но названия баз данных одинаковые на этих прилинкованных серверах", конечно же.
5 мар 18, 14:15    [21237796]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
"запрос запускается через сервер, который обращается либо одному прилинкованному серверу, либо к другому".
Как уже сказали либо динамический запрос, либо синонимы. Если запрос достаточно сложный, то лучше выбрать синонимы.

Обращение к первому серверу:
drop synonym dbo.Table1; create synonym dbo.Table1 for Server1.DB.scheme.Table1;
select * from dbo.Table1;
Обращение ко второму серверу:
drop synonym dbo.Table1; create synonym dbo.Table1 for Server2.DB.scheme.Table1;
select * from dbo.Table1;
5 мар 18, 16:26    [21238301]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Wlr-l
"запрос запускается через сервер, который обращается либо одному прилинкованному серверу, либо к другому".
Как уже сказали либо динамический запрос, либо синонимы. Если запрос достаточно сложный, то лучше выбрать синонимы.

не учите людей плохому

https://blogs.msdn.microsoft.com/sqlsakthi/2011/05/08/best-performer-distributed-query-four-part-or-openquery-when-executing-linked-server-queries-in-sql-server/
5 мар 18, 16:38    [21238346]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
Maxx,

Научите хорошему.
5 мар 18, 16:46    [21238379]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
declare 
   @table nvarchar(256) = 'DBName.schema.TableName'
  ,@sql nvarchar(2048) =''

set @sql = 'select ... from openquery(ServerName, ''select .. from '''+@table+''' )'

exec (@sql) / sp_executesql  @sql 
5 мар 18, 16:57    [21238422]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
Maxx,

Согласен.

Еще можно запрос заключить в хранимые процедуры на прилинкованных серверах.
К ним сделать синоним и вызывать по имени синонима.
Здесь отсутствует динамика.
5 мар 18, 17:05    [21238447]     Ответить | Цитировать Сообщить модератору
 Re: Путь к таблицам как переменная  [new]
invm
Member

Откуда: Москва
Сообщений: 9127
ferzmikk
Вот и поэтому я хочу написать такой запрос, чтобы в параметре указывал имя сервера.
declare @proc sysname = 'Server1.БазаДанных1.sys.sp_executesql';
declare @query nvarchar(max) = N'SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	dbo.Таблица1';

exec @proc @query;
5 мар 18, 17:12    [21238471]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить