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

Откуда: Сидней
Сообщений: 1157
Запускаю в курсоре с именами баз, отобранных по определенному признаку:

SET @cmnd = N'USE ' + @db_name
EXEC master.dbo.sp_executesql @cmnd
PRINT '---------------'
SELECT db_name()

А база не меняется, хотя PRINT @cmnd показывает правильный текст команды...
25 дек 03, 17:41    [474473]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
mort
Member

Откуда: Питер
Сообщений: 215
Потому что запрос динамический....
а тебе вообще зачем это нужно?
25 дек 03, 17:49    [474485]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
Чтобы в цикле перебрать все базы, которые реплицируются и на каждой выполнить одинаковую операцию.

А почему тогда работает вот это:
SET @s=N'USE dbname1 EXEC sp_grantdbaccess '''+@user_name+''''
EXEC master.dbo.sp_executesql @s
?
25 дек 03, 17:54    [474500]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
База-то меняется, но внутри дин. запроса. А по выходе из него база вертается взад. Поэтому, если надо сделать запрос в контексте другой базы, то это запрос сделайте прямо в том же динамическом запросе.
25 дек 03, 17:55    [474501]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
А еще текущую базу можно временно поменять, изменив префикс у sp_executesql, т.е. запрос

exec model..sp_executesql N'select * from sysobjects'

покажет записи sysobjects именно из базы model, хотя текущая база будет любой другой.
25 дек 03, 17:57    [474504]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
Уж больно запрос большой, да еще с курсором... Может просто оформить его в виде хранимой процедуры и вызвать внутри динамического запроса? Так сработает?
25 дек 03, 17:59    [474508]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
exec mydb..sp_executesql будет гораздо эротичнее :)
А делается это так:

declare @procname sysname
select @procname = 'mydb' + '..sp_executesql'
exec @retcode = @procname N'', N'', .....
25 дек 03, 19:28    [474626]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
Делаю:
SELECT @procname = @db_name + '..sp_executesql sp_article_validation ''' +  @publication + ''', ''' + @article + ''', ' 

+ CAST(@rowcount_only AS varchar(1)) + ', ' + CAST(@full_or_fast AS varchar(1))
PRINT @procname

возвращает:
mydb..sp_executesql sp_article_validation  'ACCOUNTING_Data', 

'ACCOUNTING_ARTICLE', 2, 0


Вроде все правильно, но если запустить:
SELECT @procname = @db_name + '..sp_executesql sp_article_validation ''' +  @publication + ''', ''' + @article + ''', ' 

+ CAST(@rowcount_only AS varchar(1)) + ', ' + CAST(@full_or_fast AS varchar(1))
EXEC (@procname)

то возвращает:
Server: Msg 170, Level 15, State 1, Line 1

Line 1: Incorrect syntax near 'ACCOUNTING_Data'.


Конструкция:
SELECT @procname = @db_name + '..sp_executesql sp_article_validation ''' +  @publication + ''', ''' + @article + ''', ' 

+ CAST(@rowcount_only AS varchar(1)) + ', ' + CAST(@full_or_fast AS varchar(1))
EXEC @RC=@procname

не работает вообще, говорит:
Server: Msg 2812, Level 16, State 62, Line 61

Could not find stored procedure 'legacy..sp_executesql sp_article_validation 'ACCOUNTING_Data', 'ACCOUNTING_ARTICLE', 2, 0'.
26 дек 03, 12:21    [475279]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Всегда считал, что процедура sp_executesql живет в базе master...
26 дек 03, 12:24    [475289]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
set nocount on


declare ccc cursor local read_only for select name from master..sysdatabases with (nolock)

open ccc

while 1=1 begin

declare @name sysname

fetch next from ccc into @name

if @@fetch_status <> 0 break

declare @procname sysname

select @procname = @name + '..sp_executesql'

declare @param sysname

exec @procname N'select @param = db_name()', N'@param sysname out', @param = @param out

declare @names table( name sysname )

insert into @names select @param

end

select * from @names


В результате:

name                                                                                                                             

--------------------------------------------------------------------------------------------------------------------------------

master
tempdb
model
msdb
pubs
Northwind

26 дек 03, 12:49    [475372]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
2Crimean:
Вот только я не пойму, как конструкцию:

select @procname = @name + '..sp_executesql'
exec @procname N'select @param = db_name()', N'@param sysname out', @param = @param out

передалать в аналог:

SELECT @procname = @db_name + '..sp_executesql sp_article_validation ''' + @publication + ''', ''' + @article + ''', '
+ CAST(@rowcount_only AS varchar(1)) + ', ' + CAST(@full_or_fast AS varchar(1))
EXEC (@procname)


/* прошу прощения за свою тупость. */
26 дек 03, 13:04    [475414]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SELECT @procname = @db_name + '..sp_executesql'


exec @ProcName N'exec sp_article_validation @publication=@publication, @article=@article', N'@publication type_of_@publication, @article type_of_@article', @publication=value_of_@publication, @article=value_of_@article
26 дек 03, 13:14    [475439]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
В жизни все эти переменные назначаются в курсоре, но для нашего эксперимента это не важно:

DECLARE @publication nvarchar(128)
DECLARE @article nvarchar(128)
DECLARE @rowcount_only smallint
DECLARE @full_or_fast tinyint
DECLARE @db_name sysname
DECLARE @procname sysname

SET @publication='ACCOUNTING_Data'
SET @article='ACCOUNTING_ARTICLE'
SET @rowcount_only= 2
SET @full_or_fast= 0
SET @db_name='mydb'

SELECT @procname = @db_name + '..sp_executesql'
EXEC @procname N'exec sp_article_validation @publication=@publication, @article=@article',
N'@publication type_of_@publication, @article type_of_@article',
@publication=value_of_@publication, @article=value_of_@article

получаем:

Server: Msg 2715, Level 16, State 3, Line 0
Column or parameter #1: Cannot find data type type_of_@publication.
Server: Msg 2715, Level 16, State 1, Line 0
Column or parameter #2: Cannot find data type type_of_@article.
Parameter '@publication' has an invalid data type.
Parameter '@article' has an invalid data type.
26 дек 03, 13:25    [475468]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1157
Прошу пардон, опять ступил, все заработало:

DECLARE @publication nvarchar(128)
DECLARE @article nvarchar(128)
DECLARE @rowcount_only smallint
DECLARE @full_or_fast tinyint
DECLARE @db_name sysname
DECLARE @procname sysname

SET @publication='ACCOUNTING_Data'
SET @article='ACCOUNTING_ARTICLE'
SET @rowcount_only= 2
SET @full_or_fast= 0
SET @db_name='mydb'


SELECT @procname = @db_name + '..sp_executesql'
EXEC @procname N'exec sp_article_validation @publication=@publication, @article=@article',
N'@publication nvarchar(128), @article nvarchar(128)',
@publication=@publication, @article=@article


Спасибо!
26 дек 03, 13:31    [475486]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 tpg

Так где живет sp_executesql ? :)
26 дек 03, 13:54    [475521]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, что ж... Век живи,... дураком помрешь...
26 дек 03, 14:09    [475558]     Ответить | Цитировать Сообщить модератору
 Re: Не переключается база в динамическом запросе...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Живет-то она там, но sp_ процедуры вызываются с любой базы, если они есть в мастере. Фича. Удобная, кстати.
mydb..sp_adduser и т.д. - супер!
26 дек 03, 14:18    [475581]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить