Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Путь к таблицам как переменная / 16 сообщений из 16, страница 1 из 1
03.03.2018, 13:54
    #39609992
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Здравствуйте!

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


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

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


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

Ка правильно написать запрос?
...
Рейтинг: 0 / 0
03.03.2018, 14:40
    #39610008
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Правильно - обеспечить ОДИНАКОВЫЕ имена на всех серверах.

View или Synonym те в кривые ручки.
...
Рейтинг: 0 / 0
03.03.2018, 20:23
    #39610086
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
aleks222Правильно - обеспечить ОДИНАКОВЫЕ имена на всех серверах
Имена таблиц на разных серверах одинаковые, а имена серверов разные.
...
Рейтинг: 0 / 0
03.03.2018, 20:24
    #39610087
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
aleks222View или Synonym
А как в запросе писать?
...
Рейтинг: 0 / 0
03.03.2018, 21:07
    #39610096
Klick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
ferzmikkИмена таблиц на разных серверах одинаковые, а имена серверов разные.
Ваша задача решается только динамическим запросом.
...
Рейтинг: 0 / 0
03.03.2018, 21:25
    #39610102
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
KlickferzmikkИмена таблиц на разных серверах одинаковые, а имена серверов разные.
Ваша задача решается только динамическим запросом.
Вот и поэтому я хочу написать такой запрос, чтобы в параметре указывал имя сервера.
...
Рейтинг: 0 / 0
05.03.2018, 08:04
    #39610414
Oomel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Код: sql
1.
2.
3.
4.
5.
6.
7.
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;



Полагаю, что-то подобное.
...
Рейтинг: 0 / 0
05.03.2018, 14:10
    #39610653
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
ferzmikk,

Код: sql
1.
CREATE SYNONYM dbo.Таблица1 FOR Server1.БазаДанных1.dbo.Таблица1 



соответственно, синонимы указывают на разные серверы в разных базах, но имеют одинаковые наименования
...
Рейтинг: 0 / 0
05.03.2018, 14:14
    #39610656
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
ferzmikkЗдравствуйте!

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


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

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


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

Ка правильно написать запрос?
Можно с извращениями :)
Код: sql
1.
2.
3.
4.
5.
SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM openquery(linked server сам на себя с одинаковым названием на всех серверах, 'select нужные_столбцы from база.dbo.таблица')
...
Рейтинг: 0 / 0
05.03.2018, 14:15
    #39610657
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Andy_OLAP,

Это если справедливо утверждение автора темы "Но названия баз данных одинаковые на этих прилинкованных серверах", конечно же.
...
Рейтинг: 0 / 0
05.03.2018, 16:26
    #39610743
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
"запрос запускается через сервер, который обращается либо одному прилинкованному серверу, либо к другому".
Как уже сказали либо динамический запрос, либо синонимы. Если запрос достаточно сложный, то лучше выбрать синонимы.

Обращение к первому серверу:
Код: sql
1.
2.
drop synonym dbo.Table1; create synonym dbo.Table1 for Server1.DB.scheme.Table1;
select * from dbo.Table1;

Обращение ко второму серверу:
Код: sql
1.
2.
drop synonym dbo.Table1; create synonym dbo.Table1 for Server2.DB.scheme.Table1;
select * from dbo.Table1;
...
Рейтинг: 0 / 0
05.03.2018, 16:38
    #39610749
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
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/
...
Рейтинг: 0 / 0
05.03.2018, 16:46
    #39610759
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Maxx,

Научите хорошему.
...
Рейтинг: 0 / 0
05.03.2018, 16:57
    #39610765
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Код: sql
1.
2.
3.
4.
5.
6.
7.
declare 
   @table nvarchar(256) = 'DBName.schema.TableName'
  ,@sql nvarchar(2048) =''

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

exec (@sql) / sp_executesql  @sql 
...
Рейтинг: 0 / 0
05.03.2018, 17:05
    #39610769
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
Maxx,

Согласен.

Еще можно запрос заключить в хранимые процедуры на прилинкованных серверах.
К ним сделать синоним и вызывать по имени синонима.
Здесь отсутствует динамика.
...
Рейтинг: 0 / 0
05.03.2018, 17:12
    #39610775
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путь к таблицам как переменная
ferzmikkВот и поэтому я хочу написать такой запрос, чтобы в параметре указывал имя сервера.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @proc sysname = 'Server1.БазаДанных1.sys.sp_executesql';
declare @query nvarchar(max) = N'SELECT
	Поле1,
	Поле2,		
	Поле3	
FROM
	dbo.Таблица1';

exec @proc @query;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Путь к таблицам как переменная / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]