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

Откуда: Москва
Сообщений: 243
Добрый день!
На сервере есть порядка 20 баз 1С
Как выполнить скрипт
Use Backup
Update [v8users]
Set Descr=Name
where ID=ID

Не меняя каждый раз название базы, чтобы изменения коснулись каждой базе на сервере.
Есть какой-нибудь цикл?
23 окт 14, 18:16    [16750404]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
sp_msforeachdb
23 окт 14, 18:17    [16750407]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
EXECUTE master.sys.sp_MSforeachdb
N'USE [&];
IF DB_ID() > 4
EXEC sys.sp_MSforeachtable N''EXEC sp_spaceused ''''?''''''
', @replacechar = '&'
23 окт 14, 19:19    [16750712]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Гавриленко Сергей Алексеевич,
Спасибо
Вот что получилось. Запрос вносит изменения но почему-то выдает ошибку
EXEC master..sp_MSforeachdb 'USE ? Update [v8users] Set Descr=Name where ID=ID and DB_NAME() IN ('test1','test2','test3')'


Недопустимое имя объекта "v8users"
23 окт 14, 19:20    [16750715]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
EXEC master..sp_MSforeachdb 'USE ?; Update [v8users] Set Descr=Name where ID=ID and DB_NAME() IN ('test1','test2','test3')'
23 окт 14, 19:31    [16750756]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Ошибка сохранилась, не знаю критично ли это при условии, что данные изменяются
24 окт 14, 00:03    [16751646]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Как я понимаю он ругается 4 раза эт как раз системные БД хотя вроде условие есть при определение БД для изменения
Что самое интересное если убрать условие все равно скрипт изменяет данные.
24 окт 14, 00:57    [16751792]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
BKV88
Как я понимаю он ругается 4 раза эт как раз системные БД хотя вроде условие есть при определение БД для изменения.

Поменяйте запрос так, и ошибок не будет:
EXEC master..sp_MSforeachdb 'USE ?; IF DB_NAME() IN (''test1'',''test2'',''test3'') Update [v8users] Set Descr=Name' 

Ошибка возникает из-за того, что по логическому порядку выполнения операций сначала видимо выполняется инструкция UPDATE и только потом WHERE, где вы пытаетесь отфильтровать по имени БД (видимо, потому что в документации именно про логический порядок выполнения инструкций в UPDATE не написано, или я не нашел, поэтому предположил по аналогии с SELECT).
BKV88
Что самое интересное если убрать условие все равно скрипт изменяет данные.
А чего здесь может быть интересного? Если запрос изменяет данные с условием, то без него он может только еще больше записей изменить, но не меньше.
24 окт 14, 07:31    [16751968]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Спасибо работает, но и до полноты картины хочется перенести эти таблицы как копии.
так скрипт выполняется без ошибок, но никаких действий не происходит
EXEC master..sp_MSforeachdb
'
USE [BackUPv8users];
IF DB_NAME() IN ("test1","test2","test3")
Select * INTO [?] from [?]..[v8users]
'

так скрипт выполняется с ошибками Invalid object name 'master..v8users и ругается на все системные БД, но результат записывается в таблицу Backup

EXEC master..sp_MSforeachdb
'
USE [BackUPv8users];
Select * INTO [?] from [?]..[v8users]
'

Как поправить условие, чтобы выполнялось без ошибок.
24 окт 14, 11:15    [16752812]     Ответить | Цитировать Сообщить модератору
 Re: Цикл для Update  [new]
Bone serpent
Member

Откуда:
Сообщений: 168
BKV88,
А может через курсор?

DECLARE @DBName char(32)
DECLARE DBList CURSOR FOR SELECT name FROM master.sys.databases WHERE name in ('test1, 'test2')
OPEN DBList
FETCH NEXT FROM DBListINTO @DBName WHILE @@FETCH_STATUS=0 BEGIN

  FETCH NEXT FROM DBListINTO @DBName 
END
CLOSE DBList
DEALLOCATE DBList
24 окт 14, 14:12    [16754003]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить