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

Откуда:
Сообщений: 136
Добрый день!
Имеется несколько БД с одинаковой структурой. Пример запроса:
select работник,дата,клиент,нарушение
from сервер.База1.dbo.Табл1
union
select работник,дата,клиент,нарушение
from сервер.База2.dbo.Табл1
union
select работник,дата,клиент,нарушение
from сервер.База3.dbo.Табл1


В рабочем запросе используется 15 баз, и когда нужно что-то поменять, исправить или добавить условия, то это занимает много времени и очень нудно.

Меня интересует есть ли возможность название базы засунуть в переменную и потом, например, использовать в цикле, чтобы в результате был всего 1 запрос.
Или любой другой способ, который поможет справиться с ситуацией.
Спасибо.
19 май 16, 15:59    [19194423]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21253
Создайте один раз нужное представление и не морочьте себе голову...
19 май 16, 16:01    [19194432]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @db TABLE (db SYSNAME PRIMARY KEY)
INSERT INTO @db
VALUES ('db1'), ('db2'), ('db3')

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = STUFF((
    SELECT '
UNION
SELECT работник, дата, клиент, нарушение
FROM [сервер].[' + db + '].dbo.tbl'
    FROM @db
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 9, '')

PRINT @SQL
--EXEC sys.sp_executesql @SQL
19 май 16, 16:04    [19194449]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
Lania
Member

Откуда:
Сообщений: 136
AlanDenton,
Спасибо, думаю это то что нужно)
19 май 16, 16:10    [19194507]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
AlanDenton,

а если внутри db квадратная скобка? :))

QUOTENAME()

Да, юникодные строки должны начинаться с N
19 май 16, 16:22    [19194589]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @db TABLE (db SYSNAME PRIMARY KEY)
INSERT INTO @db
VALUES ('db1'), ('db2'), ('db3')

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = STUFF((
    SELECT N'
UNION
SELECT работник, дата, клиент, нарушение
FROM ' + QUOTENAME(db) + N'.dbo.tbl'
    FROM @db
    --WHERE DB_ID(db) IS NOT NULL
    WHERE OBJECT_ID(QUOTENAME(db) + '.dbo.tbl', 'U') IS NOT NULL
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 9, '')

PRINT @SQL
--EXEC sys.sp_executesql @SQL

iap, критика засчитывается :)

Тогда что б уж совсем по феншую нужно еще проверять "а есть ли такой объект в БД" чтобы не формировать невалидный запрос
19 май 16, 16:31    [19194665]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Lania,

https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/
19 май 16, 17:50    [19195130]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
a_voronin
Lania,

https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/
Смешно прямо стало.
"without-cursors"!
sp_MSforeachdb - а что там внутри? Курсор!
19 май 16, 21:12    [19195779]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31985
Lania
Или любой другой способ, который поможет справиться с ситуацией.
По моему, вьюха всё таки лучше, чем предолженые способы с динамическим SQL
19 май 16, 22:31    [19196013]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8833
Данные такого рода лучше интегрировать в общей базе и не выполнять межбазовых запросов.
20 май 16, 11:59    [19197422]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
В рабочем запросе используется 15 баз, и когда нужно что-то поменять, исправить или добавить условия, то это занимает много времени и очень нудно.

Меня интересует есть ли возможность название базы засунуть в переменную и потом, например, использовать в цикле, чтобы в результате был всего 1 запрос.
Или любой другой способ, который поможет справиться с ситуацией.
Спасибо.[/quot]USE ?
20 май 16, 15:23    [19198923]     Ответить | Цитировать Сообщить модератору
 Re: Имя базы данных в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Лучше всего sqlcmd.exe.
20 май 16, 15:27    [19198954]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить