Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Туплю с запросом / 8 сообщений из 8, страница 1 из 1
07.05.2021, 12:06
    #40068888
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Добрый день.
В большем запросе нашёл не выполняющийся кусок. Максимально упростил для проверки, но всё равно не работает.
Вроде уже похожие конструкции использовал, уверен, что сейчас я туплю(

Требуется переключить контекст на базу данных указанную через переменную. Через принт выдаёт верное и для имени базы и для команды. Текст команды, если подставить, то работает. Но при запуске запроса ничего не выполняется.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @sql nvarchar(4000)
declare @BD_name nvarchar(1000)

SET @BD_name = 'ERP_razrab'
PRINT @BD_name

SET @sql = 'USE [' + @BD_name + '];'
EXECUTE(@sql)
--EXEC sp_executesql @sql
PRINT (@sql)



При этом есть старый код с частью, которая спокойно работает.
Код: sql
1.
2.
SET @sql = 'USE ' + @db + ' ; CREATE USER [u1С] FOR LOGIN [u1С]; ALTER ROLE [db_owner] ADD MEMBER [u1С]'
EXEC sp_executesql @sql
...
Рейтинг: 0 / 0
07.05.2021, 12:12
    #40068889
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Danion,

"Changes in database context last only to the end of the sp_executesql statement." (c) документация

Код: sql
1.
2.
3.
print db_name() 
exec sp_executesql N'use [tempdb]; print db_name() ;'
print db_name() 




outputmaster
tempdb
master
...
Рейтинг: 0 / 0
07.05.2021, 12:13
    #40068890
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Для понимания происходящего:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
use master
go
DECLARE @sql nvarchar(4000)
declare @BD_name nvarchar(1000)

SET @BD_name = 'tempdb'

SET @sql = 'print db_name();USE [' + @BD_name + '];print db_name()'
EXECUTE(@sql)

print db_name()
...
Рейтинг: 0 / 0
07.05.2021, 12:17
    #40068891
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
komrad,

Я правильно понял, что остаётся для базы в которой запущен скрипт?
Для другой только в одном запросе с use 'имя базы'?
Не очень хороший момент для меня, нужно запустить здоровый скрипт от коллег по нескольким базам подходящим под условие. И переключение через курсор на нужную выглядело удобным(

Спасибо за ответы, понял как тут реально выполняется.
...
Рейтинг: 0 / 0
07.05.2021, 12:23
    #40068892
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Danion
komrad,

Я правильно понял, что остаётся для базы в которой запущен скрипт?

по окончанию работы sp_executesql контекст возвращается в исходную базу

Danion

Для другой только в одном запросе с use 'имя базы'?

в таком варианте исполнения - да

Danion

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

найдите все базы, где нужно выполнить и далее

Код: plaintext
1.
2.
sqlcmd -S server -E -d database1 -i bigscript.sql -o output_database1.txt 
sqlcmd -S server -E -d database2 -i bigscript.sql -o output_database2.txt 
sqlcmd -S server -E -d database3 -i bigscript.sql -o output_database3.txt 
...
Рейтинг: 0 / 0
07.05.2021, 12:37
    #40068897
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
komrad,

С данным скриптом оказалось похоже легче, чем ожидалось. Базы клоны с одинаковыми объектами, просто добавил
USE [' + @BD_name + '] в начале выполнения переменной кода коллег.

А вообще можно как-то переключить на другую базу не для выполнения одной строки с USE [' + @BD_name + ']?
Указание сразу с именем базы (например: use msdb) переключает то на указанную базы для всего кода выполняемого после.
Какой-то аналог через переменную существует?
...
Рейтинг: 0 / 0
07.05.2021, 13:18
    #40068915
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Danion,

используйте sqlcmd.exe + переменные для выполнения административных задач.
...
Рейтинг: 0 / 0
07.05.2021, 13:40
    #40068929
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Туплю с запросом
Danion

Какой-то аналог через переменную существует?


можно нагенерировать скрипт и выполнить его в новом окне ssms в режиме sqlcmd (Alt+Q+M)

генерация
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
set nocount on 
declare @db sysname
declare @dbs table (db sysname)

insert into @dbs (db)
select name from sys.databases 

while exists (select top 1 1 from @dbs)
   begin
		select top 1 @db=db from @dbs
	   print N':setvar Database '+@db
	   print N'use [$(Database)]'
	   print N':r c:\temp\file1.sql'
	   print N'go'
	   print N''

	   delete @dbs 
	   where db=@db
   end 



получившийся скрипт
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
:setvar Database master
use [$(Database)]
:r c:\temp\file1.sql
go
 
:setvar Database tempdb
use [$(Database)]
:r c:\temp\file1.sql
go
 
:setvar Database model
use [$(Database)]
:r c:\temp\file1.sql
go
 
:setvar Database msdb
use [$(Database)]
:r c:\temp\file1.sql
go



результат на картинке


в файле c:\temp\file1.sql:
Код: sql
1.
print db_name()
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Туплю с запросом / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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