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

Откуда:
Сообщений: 12
Всем привет.
Есть задача - существует несколько баз на одном инстансе, при исполнении скрипта должна использовать та что является дефолтной для юзера (данные которого меняет этот скрипт). Пример скрипта:

declare @login nvarchar(20)='user200';
declare @default_db nvarchar(20);
declare @sql nvarchar(20)='use ';
use master; --после выполняются операции, я их приводить не буду
set @default_db=(select dbname from master..syslogins where name like @login); --находим для юзера user200 базу по дефолту
exec (@sql + @default_db) --и вот тут какбэ я перешел в базу дефолтную для юзера user200, но
select * from users where user_name like @login -- получаю меседж - invalid object name 'users'

я так понимаю exec не произвел переключения из базы master (скрипт запускаю целиком).
сразу нужно сказать - пробовал:

use @default_db

но use не работает с переменными.

через case тоже не вышло.

можно запихнуть весь нужный код в переменную и вместо exec использовать sp_executesql (я так понял exec не работает с переменными) - но что-то мне не нравиться такой путь, не эстетично)) наверняка есть путь проще.

какие будут предложения по переключению дб?
ms sql 2008 r2
22 окт 14, 08:59    [16741125]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
fitin,
DECLARE @SqlStr VARCHAR(MAX),@DBName VARCHAR(MAX)
SET @DBName='Master'
SET @SqlStr='USE '+@DBName+' Select * from sys.objects'
EXEC (@SqlStr) 


меняешь имя базы и все
22 окт 14, 09:57    [16741352]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
fitin
Member

Откуда:
Сообщений: 12
soljo_ua,
нет, я написал, что exec не работает с переменными (а они у меня есть), зато sp_executesql работает но я бы не хотел реализовывать запрос в динамике (ну вот так).
почитал еще про динамику - кажется не получится так как я хочу (либо спихнуть все в sp_executesql либо никак).

может есть другие варианты кроме динамического запроса?
22 окт 14, 10:47    [16741652]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
fitin
я написал, что exec не работает с переменными

И давно он не работает с переменными?
22 окт 14, 10:53    [16741686]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
fitin
soljo_ua,
нет, я написал, что exec не работает с переменными (а они у меня есть), зато sp_executesql работает но я бы не хотел реализовывать запрос в динамике (ну вот так).
почитал еще про динамику - кажется не получится так как я хочу (либо спихнуть все в sp_executesql либо никак).

может есть другие варианты кроме динамического запроса?


а как же Вы собираетесь переключаться между базами без динамики ??
22 окт 14, 11:30    [16741938]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
fitin
Member

Откуда:
Сообщений: 12
Glory,
https://www.sql.ru/faq/faq_topic.aspx?fid=104
"вы ни имеете доступа к локальным переменным, объявленым до вызова динамического запроса"
кстати там автор не вы? (без иронии)

soljo_ua,
Вы мне задали мой же вопрос.
Если получу от форума отрицательный ответ - что либо в динамике либо никак - ну фиг с ним, перешагну через своё я, и напишу в динамике)
22 окт 14, 12:04    [16742174]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
fitin
"вы ни имеете доступа к локальным переменным, объявленым до вызова динамического запроса"
кстати там автор не вы? (без иронии)

Если вы не в курсе, то локальные переменные потому и называются локальными, что доступны только в создавшемем их пакете. И sp_executesql тоже "не умеет работать с пременными" другого пакета. И вообще никто не умеет.

Умеют только передавать значения переменных. И exec тоже умеет.
22 окт 14, 12:08    [16742215]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
o-o
Guest
fitin
Glory,
https://www.sql.ru/faq/faq_topic.aspx?fid=104
"вы ни имеете доступа к локальным переменным, объявленым до вызова динамического запроса"
кстати там автор не вы? (без иронии)


капец какой
вот, сравните:
DECLARE @SQL varchar(8000), @table_name varchar(10) = 'dbo.tab'
SET @SQL = 'SELECT * FROM ' + @table_name
exec(@SQL)
go


DECLARE @SQL varchar(8000), @table_name varchar(10) = '@tab';
declare @tab table (id int);
SET @SQL = 'SELECT * FROM ' + @table_name
exec(@SQL)
go


вы ни имеете доступа к тому, что у меня красным выделено
22 окт 14, 12:14    [16742259]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
fitin
Если получу от форума отрицательный ответ - что либо в динамике либо никак - ну фиг с ним, перешагну через своё я, и напишу в динамике)

Если вы хотите выполнять один и тот же код в контекстах разных баз то вы
- либо тиражируете этот код в каждую базу
- либо используете динамический запрос
22 окт 14, 12:30    [16742386]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
У вас там без на бесконечное количество? Напишите скрипт для каждой базы.
"Универсально" <> "оптимально".
22 окт 14, 12:35    [16742441]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
fitin
Если получу от форума отрицательный ответ - что либо в динамике либо никак - ну фиг с ним, перешагну через своё я, и напишу в динамике)

Если вы хотите выполнять один и тот же код в контекстах разных баз то вы
- либо тиражируете этот код в каждую базу
- либо используете динамический запрос


А через старый добрый sp_executesql

EXEC db_name.dbo.sp_executesql N' Запрос в контексте другой базы'

EXEC tempdb.dbo.sp_executesql N'SELECT DB_NAME() '
EXEC master.dbo.sp_executesql N'SELECT DB_NAME() '
22 окт 14, 12:53    [16742612]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
А через старый добрый sp_executesql

Для произвольного числа баз ?
22 окт 14, 12:54    [16742621]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
fitin

можно запихнуть весь нужный код в переменную и вместо exec использовать sp_executesql (я так понял exec не работает с переменными) - но что-то мне не нравиться такой путь, не эстетично)) наверняка есть путь проще.



А MSDN от 2014 года очень даже не против

http://msdn.microsoft.com/en-us/library/ms188001.aspx

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @max_title varchar(30);

SET @IntVariable = 197;
SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle) 
   FROM AdventureWorks2012.HumanResources.Employee
   WHERE BusinessEntityID = @level';
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
SELECT @max_title;
22 окт 14, 12:56    [16742640]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
a_voronin
А через старый добрый sp_executesql

Для произвольного числа баз ?


Да для произвольного числа баз. В чём проблема? В цикле по списку и вперёд. Ну немного конкатенации строк -- как не без этого.
22 окт 14, 12:59    [16742672]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
В цикле по списку и вперёд.

В цикле по списку и без динамики ?? Вы серьезно ?
22 окт 14, 13:01    [16742689]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
a_voronin
В цикле по списку и вперёд.

В цикле по списку и без динамики ?? Вы серьезно ?


В цикле по списку с небольшой динамикой
22 окт 14, 13:03    [16742712]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
В цикле по списку с небольшой динамикой

Браво ! Небольшая динамика - это и не динамика вовсе.
22 окт 14, 13:04    [16742717]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
sp_msforeachdb не предлагать?
22 окт 14, 13:41    [16742939]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
fitin
Member

Откуда:
Сообщений: 12
реализовал в динамике.
вот за что я не очень за динамику - в количестве кода больше абзаца мой глаз видик кусок мусора.
ну и предотвращая холивар - динамика нужна. жаль что я не смог её избежать.
всем спасибо.
22 окт 14, 14:12    [16743149]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
Glory
Member

Откуда:
Сообщений: 104751
fitin
вот за что я не очень за динамику - в количестве кода больше абзаца мой глаз видик кусок мусора.

А как количество кода влияет на использование/неиспользование динамического запроса ?
22 окт 14, 14:13    [16743163]     Ответить | Цитировать Сообщить модератору
 Re: USE { database } через EXEC  [new]
fitin
Member

Откуда:
Сообщений: 12
Glory
А как количество кода влияет на использование/неиспользование динамического запроса ?

конечно же никак - это в общем.
но я то писал в частности (про себя) - моя оценка читабельности кода глубоко субъективна.
22 окт 14, 14:28    [16743289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить