воскресенье, 13 октября 2013 г.

Поиск в таблицах БД строки

set nocount on
declare @name varchar(128), @substr nvarchar(4000), @column varchar(128)
declare @sql nvarchar(max),
@newval nvarchar(max)

set @substr = N'Bug' --фрагмент строки, который будем искать
set @sql = N''
set @newval = N'Ошибка'

create table #rslt
(table_name varchar(128), field_name varchar(128), value nvarchar(max))

declare s cursor fast_forward for select table_name from information_schema.tables where table_type = 'BASE TABLE' order by table_name
open s
fetch next from s into @name
while @@fetch_status = 0
begin
declare c cursor fast_forward for
select quotename(column_name) as column_name from information_schema.columns
where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname', 'uniqueidentifier') and table_name = @name
set @name = quotename(@name)
open c
fetch next from c into @column
while @@fetch_status = 0
begin
-- print 'Processing table - ' + @name + ', column - ' + @column
exec('insert into #rslt select ''' + @name + ''' as Table_name, ''' + @column + ''', ' + @column +
' from' + @name + ' where ' + @column + ' like ''' + @substr + '''')
fetch next from c into @column
end
close c
deallocate c
fetch next from s into @name
end

select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Matches] from #rslt
group by table_name, field_name
order by table_name, field_name
--Если нужно, можем отобразить все найденные значения
--select * from #rslt order by table_name, field_name


select
@sql = @sql + N'UPDATE dbo.'+table_name+N' SET '+field_name+N' = N''' + @newval+N''' WHERE '+ field_name +N' = N'''+@substr+N''''+CHAR(13)
from #rslt WHERE field_name <> N'[String]'
group by table_name, field_name
order by table_name, field_name


print @sql

drop table #rslt

close s
deallocate s




Ссылка на источник

четверг, 1 августа 2013 г.

Урезание таблицы БД при превышении ограничения на размер БД

Нередко случалось так, что в MSSQL Express БД превышала установленнное для нее ограничение (для MSSQL Express 2005, например, в 4 Гб). При этом не было смысла делать шринк базы так как в файле БД не было свободного места, а журнал транзакций был пуст (модель восстановления Simple). Но можно было почистить какую-либо таблицу. Но так как база превышала ограничение на размер, чистка также не увенчалась успехом так как при удалении строк из таблицы (delete from table) SQL server не мог записать в файл транзакций транзакции из-за превышения размера базы. Путем поисков в интернете был найден следующий небольшой скрипт, который после его выполнения частично отключает запись в лог транзакций:
sp_dboption MyDB, 'trunc. log on chkpt', TRUE

Теперь можно на таблице выполнить удаление строк:


delete from table

И запустить следующий скрипт, который включает запись в лог транзакций:

sp_dboption MyDB, 'trunc. log on chkpt', FALSE

Данный метод не работает на MS SQL 2012