Главная страница  Карта сайта  Печать  Написать письмо  Twitter  RSS
Войти
Персональный сайт
Стеллецкого Владимира
Обновлено: 14.01.2018 г.

Примеры с SQL

« первая  ‹ предыдущая  1  2  3  4  ›  »

Trim всех полей в БД (07.03.2008) #

-- Trim всех полей в БД
DECLARE @tName varchar(1000), @cName varchar(1000)
DECLARE cur CURSOR FOR
SELECT c.TABLE_NAME,
       c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
     JOIN INFORMATION_SCHEMA.TABLES t ON c.TABLE_CATALOG = t.TABLE_CATALOG AND
     c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME
WHERE t.TABLE_TYPE = 'BASE TABLE' AND -- исключаем View
      DATA_TYPE = 'varchar' AND       -- выбираем только текстовые поля
      NOT c.TABLE_NAME LIKE '%_OLD'   -- если надо ограничение на обрабатываемые таблицы
order by c.TABLE_NAME,
         c.COLUMN_NAME
OPEN cur

FETCH NEXT FROM cur INTO @tName, @cName
     
WHILE @@FETCH_STATUS = 0
BEGIN
  exec ('UPDATE ['+@tName+'] SET "'+@cName+'"=LTRIM(RTRIM("'+@cName+'"))')
  FETCH NEXT FROM cur INTO @tName, @cName
END

CLOSE cur
DEALLOCATE cur

Количество строк во ВСЕХ таблицах (22.02.2008) #

-- Количество строк во ВСЕХ таблицах
create table #svv_tab_row_Count (ID int IDENTITY not null, Name varchar(100), col int)
declare @i int, @j int
declare @t varchar(100)
insert into #svv_tab_row_Count (Name)
select Table_Name from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='dbo' and TABLE_TYPE='BASE TABLE'
SET @i = 1
SET @j = 1
WHILE (@j < 2)
BEGIN
 IF NOT EXISTS(select * from #svv_tab_row_Count where ID=@i) SET @j = 2
 ELSE
 BEGIN
	select @t = Name from #svv_tab_row_Count where ID=@i
  exec ('update #svv_tab_row_Count set col=(select Count(*) from ['+@t+']) where id='+@i+'')
 end
 SET @i = @i + 1
END
select * from #svv_tab_row_Count
drop table #svv_tab_row_Count

Список пользовательских баз данных (21.03.2007) #

Часто, при разработке приложений возникает необходимость предоставить возможность выбора базы данных. При этом будет красиво, если в списке не будет системных и отключенных (остановленных) баз. Со вторым все очень просто: в статусе проверяем нужный бит на наличие, и если он установлен, то база остановлена (первое условие в примере). А вот определения именно системности базы я не нашел. Поэтому предлагаются следующие решения (для второго условия):

  • Проверять поле sid - здесь кодируется владелец (Owner) базы, так вот для пользователя sa он равен 1. У нас только системные таблицы имеют пользователя sa, поэтому это решение нам подошло.
  • Проверять поле dbid - идентификатор базы, для несистемных он более 5 (на нашем сервере), Думаю на других тоже. Так что выбирайте, что больше нравится.
  • Исключить системные базы по именам. Мне этот подход совсем не нравится.

Я знаю, что в Books-OnLine рекомендуют пользоваться INFORMATION_SCHEMA, а не прямым обращением в системные таблицы, но в данном случае INFORMATION_SCHEMA.SCHEMATA работает скажем так "странно".
Поэтому решение было выбрано такое:

SELECT * FROM sysdatabases WHERE status&100000=0 AND sid<>1 ORDER BY name

Цикл в SQL-запросе (07.11.2006) #

Цикл один из методов наглядной проверки скорости выполнения SQL-запроса. Лучше, конечно, использовать Profiler или анализировать план выполнения, но часто быстрее и проще "наглядная проверка". Итак, имеем два запроса. Надо определить какой из них предпочтительнее по скорости выполнения. Пишем два цикла в каждом, по одному запросу. Прогоняем каждый два-три раза и определяем среднюю скорость выполнения. Где меньше время, тот и быстрее, хотя не факт, что лучше. Количество выполнений запросов в цикле следует подбирать таким, чтобы время выполнения было около 20 секунд.

DECLARE @i INT
SET @i = 1

WHILE (@i < 500)
BEGIN
// здесь пишется выполняемый в цикле код
SET @i = @i + 1
END

Даты в SQL-запросах (10.10.2006) #

 ADOQuery1.Close;
 ADOQuery1.SQL.Text:='SELECT * FROM TAB1 WHERE DATE>='+
                     QuotedStr(FormatDateTime('yyyy-mm-dd 00:00:00', dtpFrom.Date))+
                     ' AND DATE<='+
                     QuotedStr(FormatDateTime('yyyy-mm-dd 23:59:59', dtpTo.Date));
 ADOQuery1.Open;

Часто в SQL-запросах необходимо сделать выборку по дате, и тут многие сталкивались, наверное, с проблемой что по разному настроенные MS SQL сервера "ожидают" дату в немного разном формате. Я в своих программах использую выше приведённый пример, и с проблемами пока не сталкивался.
dtpFrom и dtpTo это компоненты типа TDateTimePicker с датой начала периода и конца периода соответственно.

Многопользовательский доступ к таблицам MSSQL (07.10.2006) #

Часто необходимо обеспечить возможность выбора строк из Таблицы MS SQL при многопользовательской работе. Т.е. первый редактирует в транзакции, а второй в это время читает предыдущий вариант.

 ADOQuery1.Connection.IsolationLevel := ilReadUncommitted;
 ADOQuery1.Connection.Execute('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
 ADOQuery1.SQL.Text:='...';
 ADOQuery1.Open;

« первая  ‹ предыдущая  1  2  3  4  ›  »

  Вы 43461 посетитель этой странички
с 07 октября 2006 года
© 2000–2018 http://svv-home.ru
О сайте