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

Откуда: Bergen
Сообщений: 831
Помогите разобраться со следующим:

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

DECLARE @DBName NVARCHAR(20) = datename(DAY, getdate())+'_'+datename(MONTH, getdate());

USE @DBName
go

Версия:
Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6001: Service Pack 1)
3 дек 09, 17:38    [8016118]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
Динамическим запросом, например.
3 дек 09, 17:43    [8016150]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Какого размера скрипт и откуда он берется?
3 дек 09, 17:45    [8016159]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.
3 дек 09, 17:54    [8016213]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Тьфу ты 200 строк, все равно многовато.
3 дек 09, 17:56    [8016228]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
DECLARE @script nvarchar(max) = ' .....'
DECLARE @procname sysname = 'db1.dbo.sp_executesql'

EXEC @procname @script
3 дек 09, 17:59    [8016252]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Glory
Member

Откуда:
Сообщений: 104760
tarrus
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.

И где/как вы собираетесь запускать этот скрипт на выполнение ?
3 дек 09, 18:01    [8016264]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Glory
tarrus
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.

И где/как вы собираетесь запускать этот скрипт на выполнение ?


Собираюсь запускать через джоб.
3 дек 09, 18:03    [8016275]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Glory
Member

Откуда:
Сообщений: 104760
tarrus
Glory
tarrus
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.

И где/как вы собираетесь запускать этот скрипт на выполнение ?


Собираюсь запускать через джоб.

И как текст скрипта попадет в тело джоба ?
3 дек 09, 18:04    [8016278]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
aleks2
Guest
Присобачить
USE [база] go
в начало скрипта - это задача для ясельников с задержкой развития.
3 дек 09, 18:09    [8016313]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Glory
tarrus
Glory
tarrus
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.

И где/как вы собираетесь запускать этот скрипт на выполнение ?


Собираюсь запускать через джоб.

И как текст скрипта попадет в тело джоба ?


Копи-пастом моими руками, он неизменен, но база, по которой нужно его прокатить постоянно меняется.
3 дек 09, 18:09    [8016317]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
aleks2
Присобачить
USE [база] go
в начало скрипта - это задача для ясельников с задержкой развития.


Попробуйте. Буду рад, если у вас получится.
3 дек 09, 18:10    [8016326]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Glory
Member

Откуда:
Сообщений: 104760
tarrus
Glory
tarrus
Glory
tarrus
Скрипт приличный около 800 строк. Скрипт предоставлен внешним разработчиком, укоротить никак.

И где/как вы собираетесь запускать этот скрипт на выполнение ?


Собираюсь запускать через джоб.

И как текст скрипта попадет в тело джоба ?


Копи-пастом моими руками, он неизменен, но база, по которой нужно его прокатить постоянно меняется.

Я бы сделал так
- скопировал файл со скрипитом на сервер
- в джобе бы поставил формирование вызова скрипта через утилиту osql/sqlcmd, которая поддерживает выбор текущей базы через соответстующий ключ запуска
- запускал бы сформированную строку запуска через xp_cmdshell
3 дек 09, 18:17    [8016354]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Glory,

Интересная идея, я про osql и забыл совсем, со времен MSDE не использовал.

Спасибо за идею!
3 дек 09, 18:21    [8016369]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
iljy
Member

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

можно еще так попробовать:
Сохранить скрипт в файл, а дальше
declare @s varchar(max)
declare @DbName varchar(128) = 'tempdb'
select @s = 'use ' + @DbName + ' ' + cast(script as varchar(max))
from openrowset(bulk 'имя файла со скриптом', SINGLE_BLOB) t(script)
exec(@s)
3 дек 09, 18:23    [8016381]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно и два джоба сделать
1ый джоб будет менять @database_name шага со скриптом во 2ом джобе. Ну и запускать 2ой джоб
3 дек 09, 18:24    [8016388]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Glory
Можно и два джоба сделать
1ый джоб будет менять @database_name шага со скриптом во 2ом джобе. Ну и запускать 2ой джоб


Это довольно опасно мне кажется, я всегда прописываю в теле джоба USE <база> жестко, т.к. если базы нет, а кто-то зайдет в джоб и сохранит в этот момент, то какая база будет выбрана неизвестно.
3 дек 09, 18:29    [8016412]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
iljy
tarrus,

можно еще так попробовать:
Сохранить скрипт в файл, а дальше
declare @s varchar(max)
declare @DbName varchar(128) = 'tempdb'
select @s = 'use ' + @DbName + ' ' + cast(script as varchar(max))
from openrowset(bulk 'имя файла со скриптом', SINGLE_BLOB) t(script)
exec(@s)


Не срабытывает USE, когда он внутри EXEC'а, к сожалению.
3 дек 09, 18:32    [8016424]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
iljy
Member

Откуда:
Сообщений: 8711
tarrus

Не срабытывает USE, когда он внутри EXEC'а, к сожалению.


Да ну??
use master
select * from INFORMATION_SCHEMA.Tables
exec('use tempdb select * from INFORMATION_SCHEMA.Tables')

просто после выполнения exec контекс возвращается.
3 дек 09, 18:39    [8016452]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
iljy
tarrus

Не срабытывает USE, когда он внутри EXEC'а, к сожалению.


Да ну??
use master
select * from INFORMATION_SCHEMA.Tables
exec('use tempdb select * from INFORMATION_SCHEMA.Tables')

просто после выполнения exec контекс возвращается.


Я не правильно интерпретировал, сорри, привык после USE ставить GO. Так действительно сработает, но в теле моего скрипта есть много GO, а это уже никак.
3 дек 09, 18:48    [8016482]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
tarrus
iljy
tarrus

Не срабытывает USE, когда он внутри EXEC'а, к сожалению.


Да ну??
use master
select * from INFORMATION_SCHEMA.Tables
exec('use tempdb select * from INFORMATION_SCHEMA.Tables')

просто после выполнения exec контекс возвращается.


Я не правильно интерпретировал, сорри, привык после USE ставить GO. Так действительно сработает, но в теле моего скрипта есть много GO, а это уже никак.


вы же в джобе собираетесь выполнять скрипт? укажите джобу текущую базу. Или так не пройдет?
3 дек 09, 19:15    [8016565]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
Winnipuh,

При каждом выполнении джоба используемая база будет иметь другое название. Вот в чем основная проблема.
3 дек 09, 19:19    [8016574]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
iljy
Member

Откуда:
Сообщений: 8711
tarrus

Я не правильно интерпретировал, сорри, привык после USE ставить GO. Так действительно сработает, но в теле моего скрипта есть много GO, а это уже никак.

use master
select * from INFORMATION_SCHEMA.Tables
exec('use tempdb select * from INFORMATION_SCHEMA.Tables
go
select * from INFORMATION_SCHEMA.Tables
')
Вы чего-то усложняете все сильно...
3 дек 09, 19:26    [8016587]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
tarrus
Member

Откуда: Bergen
Сообщений: 831
iljy,

use master
exec('use tempdb 
go
select * from INFORMATION_SCHEMA.Tables
')

а так не работает:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'go'.
3 дек 09, 19:39    [8016614]     Ответить | Цитировать Сообщить модератору
 Re: Как передать в USE переменную?  [new]
iljy
Member

Откуда:
Сообщений: 8711
tarrus
iljy,

use master
exec('use tempdb 
go
select * from INFORMATION_SCHEMA.Tables
')

а так не работает:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'go'.

сори, тормознул, она go в моем примере как алиас таблицы воспринимала да, go нельзя в exec передавать, это не команда TSQL (честно говоря сам удивился когда сработало). Но по-моему job тоже не поймет скрипт с использованием go. Так что остается sqlcmd.
3 дек 09, 19:44    [8016631]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить