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

Откуда:
Сообщений: 4
Всем доброго утра, помогите разобраться с задачкой пожалуйста, хочу в начале скрипта обновления БД вставить автоматический выбор базы, так как терминалов к обновлению много и общее в них только окончание имени БД => _688

Я тут накидал и теоретически должно отрабатывать, но к сожалению что то пошло не так(


DECLARE @SQL nvarchar(15), @DB_name nvarchar(10)
SET @DB_name = (select name from sys.databases where name Like '%_688')
SET @SQL = 'USE ' + @DB_name

exec sp_executesql @SQL

Заранее огромное Вам спасибо и +++++ к карме =)
7 мар 17, 09:29    [20269632]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alex Lexx,

если надо обновлять сразу на многих - выполняйте через sqlcmd или всё обновление засовывайте в свой @SQL
7 мар 17, 09:57    [20269723]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
sp_MSforeachdb
7 мар 17, 10:02    [20269733]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
baza906
Member

Откуда:
Сообщений: 282
Alex Lexx,
припиши название твоей базы к процедуре:
exec tvojabaza.tvojashema.sp_executesql 'SQL'
7 мар 17, 10:04    [20269736]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
baza906
Member

Откуда:
Сообщений: 282
Alex Lexx,
вернее схема будет всегда dbo
exec tvojabaza.dbo.sp_executesql 'SQL'
7 мар 17, 10:04    [20269740]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
baza906,
автор
sp_MSforeachdb
вот радость то, в чём там будет разница с sp_executesql :)

автор
припиши название твоей базы к процедуре:
действительно, практически @автоматический выбор базы@
7 мар 17, 10:06    [20269747]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Alex Lexx, Like '%_688' означает "оканчивается на какой-то символ плюс '688'".
Разве это требуется?

TaPaK
вот радость то, в чём там будет разница с sp_executesql :)
В том, что все нужные базы внутри этой процедуры перебираются в цикле по курсору для выполнения заданного скрипта.
А sp_executesql ещё только предстоит "вручную" вызвать в каждой базе, то есть написать курсор самостоятельно.
7 мар 17, 10:31    [20269822]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
baza906
Member

Откуда:
Сообщений: 282
TaPaK,

--USE ddd
--create table t1 (a nvarchar(50))
--insert into t1 VALUES ('ddd_t1')


--USE test
--create table t1 (a nvarchar(50))
--insert into t1 VALUES ('test_t1')


DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(10), @SQL_SELECT NVARCHAR(MAX) = 'SELECT * FROM DBO.T1'
SET @DB_NAME = DB_NAME()
SET @SQL = 'EXEC ' + @DB_NAME + '.DBO.SP_EXECUTESQL N'''+@SQL_SELECT+''''  
EXEC (@SQL)
7 мар 17, 10:37    [20269846]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap,

исходя из тз :)
автор
терминалов к обновлению много и общее в них только окончание имени БД => _688

1 база на многих серверах...
7 мар 17, 10:37    [20269847]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
baza906
TaPaK,

--USE ddd
--create table t1 (a nvarchar(50))
--insert into t1 VALUES ('ddd_t1')


--USE test
--create table t1 (a nvarchar(50))
--insert into t1 VALUES ('test_t1')


DECLARE @SQL NVARCHAR(MAX), @DB_NAME NVARCHAR(10), @SQL_SELECT NVARCHAR(MAX) = 'SELECT * FROM DBO.T1'
SET @DB_NAME = DB_NAME()
SET @SQL = 'EXEC ' + @DB_NAME + '.DBO.SP_EXECUTESQL N'''+@SQL_SELECT+''''  
EXEC (@SQL)
Для наименования объектов сделан специальный тип - sysname
Перед литеральными юникодными строками хорошо бы всегда писать букву N
7 мар 17, 10:47    [20269876]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Alex Lexx, Like '%_688' означает "оканчивается на какой-то символ плюс '688'".
Пишите так:
LIKE '%[_]688'
7 мар 17, 10:49    [20269884]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
baza906
Member

Откуда:
Сообщений: 282
iap,
так я же написал:
 .DBO.SP_EXECUTESQL N''

для корректной работы скрипта этого достаточно
7 мар 17, 10:50    [20269888]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
baza906
iap,
так я же написал:
 .DBO.SP_EXECUTESQL N''


для корректной работы скрипта этого достаточно
А ещё написали
@SQL_SELECT NVARCHAR(MAX) = 'SELECT * FROM DBO.T1'
Ну, считайте, что я такой педант ненормальный...
Ну и надо
@DB_NAME sysname
7 мар 17, 10:55    [20269904]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Alex Lexx
хочу в начале скрипта обновления БД вставить автоматический выбор базы
Для понимания происходящего:
use master;
exec sp_executesql N'use model; select db_name()';
select db_name();
7 мар 17, 10:59    [20269922]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
baza906
Member

Откуда:
Сообщений: 282
iap,
@DB_NAME sysname

спасибо, буду знать
7 мар 17, 11:01    [20269934]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Alex Lexx
Member

Откуда:
Сообщений: 4
iap,

DECLARE @SQL nvarchar(4000), @DB_name sysname
SET @DB_name = (select name from sys.databases where name Like '%_688')
SET @SQL = N'USE ' + @DB_name +'
SELECT * FROM tLocalParams'
exec (@SQL)

вот это работает лишь для динамического скрипта, но увы мне нужно еще несколько процедур выполнить и нужна статика, а втыкать это в скрипты обновления слишком накладно...
7 мар 17, 11:21    [20270075]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Alex Lexx
вот это работает лишь для динамического скрипта, но увы мне нужно еще несколько процедур выполнить и нужна статика, а втыкать это в скрипты обновления слишком накладно...
xp_cmdshell + sqlcmd вас спасут.
7 мар 17, 11:26    [20270123]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
invm
Alex Lexx
вот это работает лишь для динамического скрипта, но увы мне нужно еще несколько процедур выполнить и нужна статика, а втыкать это в скрипты обновления слишком накладно...
xp_cmdshell + sqlcmd вас спасут.


Да, в SQL скрипте имена можно задать переменными, значения которых передавать в параметре выполнения sqlcmd.

Переменные выглядят как $(имяпеременной)

USE [$(DatabaseName)];
GO
7 мар 17, 11:56    [20270330]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Alex Lexx
Member

Откуда:
Сообщений: 4
-- To allow advanced options to be changed.  
EXEC sp_configure 'show advanced options', 1;  
GO  
-- To update the currently configured value for advanced options.  
RECONFIGURE;  
GO  
-- To enable the feature.  
EXEC sp_configure 'xp_cmdshell', 1;  
GO  
-- To update the currently configured value for this feature.  
RECONFIGURE;  
GO  

DECLARE @str nvarchar(200)
DECLARE @str1 nvarchar(200)
DECLARE @str2 nvarchar(200)
DECLARE @str3 nvarchar(200)
DECLARE @str4 nvarchar(200)
DECLARE @str5 nvarchar(200)
DECLARE @str6 nvarchar(200)
DECLARE @str7 nvarchar(200)
DECLARE @str8 nvarchar(200)

DECLARE @dbName sysname

SELECT @dbName = name from sys.databases where name Like '%_688'

set @str=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\Clear_Temp_Tables.sql -o D:\Update\InstallLogs\Clear_Temp_Tables.log'
set @str1=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -Q "exec SP_DBREINDEX;" -b -o D:\InstallLogs\Izm_REINDEX.log'
set @str2=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -Q "dbcc shrinkdatabase (0);" -b -o D:\InstallLogs\Izm_SHRINK.log'
set @str3=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\286_to_973.sql -o D:\Update\InstallLogs\Izm_286_to_973.log'
set @str4=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\973_to_072_BETA.sql -o D:\Update\InstallLogs\Izm_973_to_072_BETA.log'
set @str5=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\TT2842.sql -o D:\Update\InstallLogs\Izm_TT2842.log'
set @str6=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\ADD_Rights.sql -o D:\Update\InstallLogs\Izm_ADD_Rights.log'
set @str7=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\ParamsSSPS.sql -o D:\Update\InstallLogs\ParamsSSPS.log'
set @str8=N'sqlcmd.exe -U sa -P daorliar -d ' + @dbName+' -i D:\Update\scripts\InstallASPO_XP.sql -o D:\Update\InstallLogs\InstallASPO_XP.log'

select @str ='echo '+ @str +' > D:\Update\scripts\bats\RunIzm.bat'
select @str1 ='echo '+ @str1 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str2 ='echo '+ @str2 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str3 ='echo '+ @str3 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str4 ='echo '+ @str4 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str5 ='echo '+ @str5 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str6 ='echo '+ @str6 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str7 ='echo '+ @str7 +' > D:\Update\scripts\bats\RunIzm.bat'
select @str8 ='echo '+ @str8 +' > D:\Update\scripts\bats\RunIzm.bat'

EXEC xp_cmdshell @str
GO
EXEC xp_cmdshell @str1
GO
EXEC xp_cmdshell @str2
GO
EXEC xp_cmdshell @str3
GO
EXEC xp_cmdshell @str4
GO
EXEC xp_cmdshell @str5
GO
EXEC xp_cmdshell @str6
GO
EXEC xp_cmdshell @str7
GO
EXEC xp_cmdshell @str8
GO


Подскажите пожалуйста как бы мне сделать так чтобы sql добавлял строки в батник а не перезаписывал сам батник?
Уже голова чет не варит после 3 суток капания...
7 мар 17, 15:08    [20271406]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Alex Lexx,

А вы смелый: теперь весь интернет знает пароль от вашего sa.
7 мар 17, 15:11    [20271422]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Alex Lexx
после 3 суток капания...
Сантехника не пробовали вызывать? :)
select @str ='echo '+ @str +' > D:\Update\scripts\bats\RunIzm.bat'
select @str1 ='echo '+ @str1 +' >> D:\Update\scripts\bats\RunIzm.bat'
select @str2 ='echo '+ @str2 +' >> D:\Update\scripts\bats\RunIzm.bat'
...
7 мар 17, 15:18    [20271451]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и use к переменной  [new]
Alex Lexx
Member

Откуда:
Сообщений: 4
Гавриленко Сергей Алексеевич,

эт старый пароль от sa =) тренируюсь на старой БД)))
7 мар 17, 15:20    [20271455]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить