Когда нужно выполнить запрос к базе, а имя базы лежит в переменной, то use
использовать не получится, но можно начать путь к таблице с имени базы. И лучше забрать его в квадратные скобки, иначе будет проблема с именами баз со спецсимволами внутри. Типа База3.14.15
или ERP-2003
SELECT @LogName=name from [' +@DBName+'].sys.database_files where type_desc = 'LOG'
Если результатом будет таблица, то можно гонять курсор. Если точно одна строка, то нужно использовать вот такой фокус (переменные должны быть объявлены заранее)
SELECT @LogName=name from [DBName].sys.database_files where type_desc = 'LOG'
SET @SQLText = 'SELECT @LogName=name from [' +@DBName+'].sys.database_files where type_desc = ''LOG''';
EXEC sp_executesql @SQLText, N'@LogName sysname OUTPUT', @LogName=@LogName OUTPUT;
Если нужно не просто выдернуть табличку, а выдернуть из нее параметры то кроме exec
есть замечательная штука sp_executesql
- первый параметр это запрос, второй - описание параметров запроса, третий - соответствие параметров внутри запроса и снаружи. ХЗ, точно ли нужен OUTPUT в части описания, но в части сопоставления точно нужен - иначе все выполнится, но наружу ничего не вернется
Для доступа к скулю на соседней машине нужен:
- Включенный 1433 порт на фаерволе
- TCP режим работы в SQL Configuration
- Для парольного доступа - смешанный режим в свойствах сервера в студии
attach mdf without log При выборе mdf файла создается вторая строчка для лога с предупреждением "будет создан новый пустой", а потом падает с ошибкой доступа. Способ обхода - просто удалить строчку лога. Тогда скуль сам соберет лог как надо. (и положит в папку по умолчанию)
Иногда происходит отвязка юзверя, или при переносе базы с сервера на сервер нужно привязать к пользователю с тем же именем. Запрос такой
ALTER USER sonarqube WITH LOGIN = sonarqube;
Используется утилита sqlcmd
sqlcmd -S <Инстанс сервера> -U <Пользователь> -P <Пароль> -Q "RESTORE DATABASE %1 FROM DISK='%2' WITH REPLACE"
sqlcmd -S <Инстанс сервера> -U <Пользователь> -P <Пароль> -Q "ALTER DATABASE [Имя базы данных] SET OFFLINE WITH ROLLBACK IMMEDIATE"
WITH ROLLBACK IMMEDIATE - это с разрывом существующих соединений
на всякий случай рядом, пока без проверок Детач/аттач
Goto cmd (Run->cmd)
To connect to local SQL server default instance
>sqlcmd -S .\
Or to connect to named instance (SQLEXPRESS being your named instance)
>sqlcmd -S .\SQLEXPRESS
Or connect to SQL server on another machine
>sqlcmd -S REMOTEMACHINE\INSTANCENAME
After connecting switch to master database
>use master;
>go
Then you should see – Changed database context to ‘master’.
Now attach/detach your database
>sp_detach_db ‘database name’;
>go
>sp_attach_db ‘database name’,’path to mdf’,’path to ldf’;
>go
Edit: To verify the file location, sp_helpfile stored procedure can be used.
use ‘database name’;
go
sp_helpfile
go
https://speshuric.livejournal.com/53616.html
select
case when grouping (so.name) = 1 then 'Итого:' else so.name end name,
8*sum(si.data_pages) data,
8*sum(si.index_pages) indexes,
8*(sum(si.data_pages)+sum(si.index_pages)) q,
case when grouping (so.name) = 0 then max (si.rows) else 0 end rows,
count (is_index) index_count,
case when grouping (so.name) = 0 then min (isnull(date_recount,getdate())) else null end date_recount_stat,
case when grouping (so.name) = 0 then max (reclen) else 0 end record_len
from
(select
case
when si.indid between 2 and 251 then isnull(si.used,0)
else 0
end index_pages,
case
when si.indid<2 then si.dpages
when si.indid = 255 then isnull(si.used,0)
else 0
end data_pages,
case when si.indid < 2 then si.rows
when si.indid between 2 and 251 then 0
else 0
end rows,
case
when si.indid between 1 and 251 then 1
else 0
end is_index,
si.id, si.indid, si.name,
STATS_DATE(si.id, si.indid) date_recount
from sysindexes si (nolock)
where si.name not like '_wa_sys%' and si.name not like 'Statistic_%'
) si inner join sysobjects as so (nolock) on so.id=si.id and so.name not like 'sys%'
inner join (select sum(length) reclen, id from syscolumns (nolock) group by id) sc on sc.id = so.id
group by so.name with rollup
order by grouping (so.name), q desc, so.name
- Скрипт запускать из контекста анализируемой БД
- Размеры приведены к килобайтам.
- rows может быть неточно (см. документацию)
- Колонки:
- name - имя таблицы
- data - килобайт данных
- indexes - килобайт индексов
- q - сумма данных и индексов
- rows - записей
- index_count - индексов
- date_recount_stat - статистика
- record_len - длина записи
- На 2005 не проверял.