Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Сравнительный анализ MS Sql и другие...  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
2 locky
Давай сюды твой запрос)).. хочеца заняцца творчеством...))
27 янв 04, 13:21    [508389]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2gardenman

select @@microsoftversion

:-)
27 янв 04, 13:49    [508466]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Хе хе. Ну если СУБД поддерживает глобальные переменные, то MSSQL победим:
-- Процедура инициализации подключения сессии


create procedure sp_OnConnect ()
begin
create variable @@MicrosoftVersion int;
set @@MicrosoftVersion = 8;
end;

GO

-- Устанавливаем процедуру

set option PUBLIC.LOGIN_PROCEDURE = 'sp_OnConnect';

GO

-- Теперь в любом соединении работает

select @@MicrosoftVersion;

Script Copyright ASA9 :)
27 янв 04, 16:47    [509001]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2ASCRUS
Догадливые, блин... думал, задачка дольше продержится :-)
Хотя, если подходить формально, то результат - неправильный :-)
У меня в @@microsoftversion судя по всему лежит какая-та внутренняя версия. В BOL описания нету :-(
А ваще-та, всегда не любил Sybase за то, что там есть то, что мне иногда надо, а в MS SQL этого нету :-(
В частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.
27 янв 04, 16:56    [509031]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
Из МСДН

if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
27 янв 04, 17:10    [509067]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
locky
В частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.

Есть, есть :) Называется глобальные временные таблицы. Достаточно один раз создать, описание хранится в БД, а каждая подключаемая сессия ее видит как собственную, с своими данными и никаких проблем с разделением по сессиям и блокировками. Можно ее еще сделать как NOT TRANSACTIONAL в целях ускорения операций так сказать :) Еще в ASA можно делать вычисляемые поля на UDF, а по ним строить индексы, или в триггерах BEFORE изменять значения полей, TRUNCATE на таблицы с FOREIGN KEY и триггерами. А еще ...... она и на швейной машинке работать умеет :)

P.S.Будем надеятся, что все таки новый MSSQL оправдает надежды и пусть не все, но многое дополнит к своей функциональности. Иногда такие мелочи довольно таки приятны при проектировке БД.
27 янв 04, 17:26    [509102]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...
27 янв 04, 17:56    [509196]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
2 gardenman
declare @BirthDate datetime,

@vCurrentDate datetime

set @BirthDate = '19660914'
set @vCurrentDate = '20040127'

print @BirthDate
print @vCurrentDate

select datediff(dd, @BirthDate, @vCurrentDate)
27 янв 04, 18:06    [509220]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045

SET DATEFORMAT dmy

select datediff(day,'14.9.1966', getdate())


или я че не понял?
27 янв 04, 18:06    [509222]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Yo!
Guest
Oracle :)


1* select sysdate - to_date('14/09/1966', 'dd/mm/yyyy') as days from dual
SQL> /

DAYS
----------

13649,7119
27 янв 04, 18:09    [509228]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
ASA
select Now() - convert(date, '19660914')

ответ: 13649
27 янв 04, 18:12    [509232]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
это видно был тест - на что я правда не понял...
27 янв 04, 18:17    [509236]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Это как я понял конкурс на "слабо" :) А вот такое слабо красивым кодом написать на других СУБД:
begin

declare @SQL long varchar;
declare @Table_Name varchar(128);
declare @Domain_Name varchar(128);

set @Table_Name = 'Man';
set @Domain_Name = 'VARCHAR';

select 'select ' || List( c.Column_Name ) || ' from ' || @Table_Name
into @SQL
from SysColumn c
key join SysTable t on t.Table_Name = @Table_Name
key join SysDomain d on d.Domain_Name = @Domain_Name;

execute immediate with result set on @SQL;
end

Данный пример возвращает набор данных c указанной таблицы (Man), в который включаются поля только с указанным типом (VARCHAR).
27 янв 04, 18:33    [509265]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Yo!
Guest
Oracle :)


SELECT * FROM ALL_TAB_COLUMNS
where owner='MY_OWNER' and table_name='MY_TABLE'
and data_type='VARCHAR2' ;
27 янв 04, 19:02    [509314]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ZrenBy
Member

Откуда: Костромаа
Сообщений: 1571

use pubs
declare @n varchar(100) set @n = 'authors'
declare @t varchar(100) set @t = 'varchar'
declare @S varchar(1000)
set @S = ''
select @S = @S+(case when @s='' then ' ' else ',' end)+column_name
from information_schema.columns
where table_name=@n and data_type=@t

set @S = 'select'+@S+' from '+@n
exec sp_sqlexec @S
27 янв 04, 19:28    [509355]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ZrenBy
Member

Откуда: Костромаа
Сообщений: 1571
лучше конечно

set @S = 'select '+(case when @S='' then '''нету''' else @S end)+' from '+@n
27 янв 04, 19:37    [509369]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2ASCRUS
И нетранзакционность есть? Класс... еще больше ненавижу... Если при этом еще и индексы поддерживаются на таких таблицах... В Informix, по моим сведениям, тоже можно сделать нетранзакционные таблицы, но там несколько ограничений (вроде как нельзя на таких таблицах делать индексы).
А фича полезная....
Я как-то с горя пожаловался в форуме на то, что в MS SQL нельзя отключить transaction log, так чуть не съели, сказали что это неправильно... что всё должно логгироваться и всё такое...
А truncate и в MS SQL можно организовать, токо там приходится править системную таблицу для этого... так что это так - выверт :-(
27 янв 04, 20:01    [509403]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
locky
"Нетранзакционность" на глобальные временные таблицы есть. И индексы есть, в том числе можно и кластерный сделать. А заодно для полного счастья можно полноценна триггера BEFORE и AFTER повесить, хотя это выглядит забавно для временной сессионной таблицы.

All
Кстати очень полезная разминка, заодно можно посмотреть, чего и как в SQL у различных СУБД есть. Предлагаю продолжить тему для познавательных и просветительных целей, чтобы лучше представлять себе возможности конкурирующих БД.

Ну CTE (Common Table Expression) приводить в пример не буду, вроде WITH ... SELECT и поддержка иеархических запросов почти у всех есть или скоро будет (это к Якону).

Меня лично порадовали следующие расширения SQL в ASA. Интересно у кого есть аналоги:
KEY JOIN - связь таблиц по FOREIGN KEY:
select *

from Table1
key left join Table2

3-е вкусности в KEY JOIN:
1. не надо в запросах вспоминать, по каким полям связывать таблицы
2. если поменять имена полей связи в структуре БД или даже сам FOREIGN KEY, то все запросы с KEY JOIN продолжают работать, так как связь тут уже не физическая, а логическая.
3. подстегивает начинающих получше продумывать связи таблиц

Расширенный INSERT

insert into table1 on existing update with auto name
select field1, field2
from Table2

В данном примере в INSERT не надо указывать имена полей, по опции WITH AUTO NAME будут браться поля, имена которых совпадают с именами полей запроса. Опция ON EXISTING UPDATE в данном случае еще интереснее - фактически в TABLE1 будут добавлены все новые записи из TABLE2 и обновлены существующие (естественно для этого требуется наличие PRIMARY KEY, плюс чтобы оно не было AUTOINCREMENT). В обычном ANSISQL этот оператор как минимум придеться разбить на 2 части:
update table1 t1

set field2 = t2.field2
from table1 t1
inner join table2 t2 on t2.field1 = t1.field1

insert into table1 (field1, field2)
select field1, field2
from table2 t2
where not exists(select * from table1 where field1 = t2.field1)


Ну в догонку: в принципе я так думаю никого не удивишь атомарными блоками и exception:
begin atomic

insert ...
update ...
delete ...
exception
when others then resignal
end

(для не знающих - любые операции в атомарном блоке или выполняются или откатываются, фактически это просто более простая запись SAVEPOINT транзакций).

Полезной фичей так же оказались виртуальные индексы. Смысл их прост - создаем виртуальный индекс, физически он не строиться, в БД не присутствует, соответственно времени на построение не занимает, никого не блокирует и на реальное выполнения запросов не влияет. Виден только на время действия сессии, если раньше не прибить командой DROP INDEX. Зато прекрасно виден в планах запросов, если их получать с опцией VIRTUAL. Это дает прекрасную возможность ничего не блокируя, не строя и не изменяя поиграться с индексами на таблицу, посмотреть, как все это выглядит в плане запроса и прикинуть, а стоит ли делать индекс и как его лучше сделать.

Интересно было бы узнать, у кого в других СУБД есть интересные расширения SQL ?
27 янв 04, 22:50    [509548]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
c127
Guest
gardenman> Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...

А вот кто решит такую задачку на DB2?
28 янв 04, 03:06    [509614]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347

Database server = DB2/NT 8.1.3
SQL authorization ID = DB2ADMIN
Local database alias = SAMPLE


values (days(current date) - days('14.09.1966'))

1
-----------

13650

1 record(s) selected.

28 янв 04, 10:17    [509878]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Oracle 9.2

select *
from Table1
key left join Table2


KEY JOIN не нашел, зато есть NATURAL JOIN: тоже неявное указание полей, только по совпадению имен.
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_103a.htm#2080379

Мое личное мнение - от лукавого эти скрытые соответствия:) Теоретически между двух таблиц может существовать несколько ссылочных ограничений, а с другой стороны - имена полей в них необязательно совпадают.


insert into table1 on existing update with auto name
select field1, field2
from Table2


WITH AUTO NAME вроде нет. Можно, конечно поля не указывать, но тогда присвоение будет позиционное, ИМХО как и везде. Функцию ON EXISTING UPDATE выполняет оператор MERGE
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_915a.htm#2080942

Атомарные блоки для меня были всегда. "Для меня" - означает с версии Oracle 7.3, хотя скорее всего были и раньше.

Дополнительно

dan@sqlmast> col YEAR_TO_MONTH format a30
dan@sqlmast> col DAY_TO_SECOND format a30
dan@sqlmast> select (sysdate - to_date('14.09.1966', 'dd.mm.yyyy')) year to month year_to_month
2 , (sysdate - to_date('14.09.1966', 'dd.mm.yyyy')) day to second day_to_second
3 from dual;

YEAR_TO_MONTH DAY_TO_SECOND
------------------------------ ------------------------------

+000000037-04 +000013650 10:36:16


Т.е. прошло полных 37 лет и 4 месяца
28 янв 04, 10:43    [509947]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
c127
Guest
2 gardenman

Да, посчитало правильно.

Цитирую по памяти документацию по DB2 ver.7.x: При вычислении разницы дат полагается, что год содердит 365 дней, месяц содержит 30 дней.

Не поверил своим глазам, проверил на линуховой версии, отработало в полном соответствии с документацией, в феврале 2001 года оказалось 30 дней. Никто с таким эффектом сталкивался?

В остальном DB2 произвел очень хорошее впечатление.
28 янв 04, 11:30    [510113]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
Мое личное мнение - от лукавого эти скрытые соответствия:) Теоретически между двух таблиц может существовать несколько ссылочных ограничений, а с другой стороны - имена полей в них необязательно совпадают.

Угу, в ASA тоже есть NATURAL JOIN, только я не стал их приводить как раз по той причине, что это от лукавого. KEY JOIN в отличие от NATURAL JOIN как раз однозначно определяет связь таблиц по существующему FOREIGN KEY (если его нет, то естественно будет возбуждена ошибка).

Еще навскидку парочка расширений SQL:

Расширенный UPDATE:
update top 100 Table1

set Field1 = 1
order by Field2


Организация цикла FOR по курсору:
for LoopName as CursorName no scroll cursor 

for
select Field1 as @Field1, Field2 as @Field2
from Table1
for read only
do
print 'Field1 = ' || @Field1 || ', Field2 = ' || @Field2
end for

Данная конструкция организует именованный цикл LoopName, создает FORWARD ONLY курсор CursorName, внутри цикла обьявляет переменные @Field1 и @Field2 и соотвествующе последовательно перебирает весь курсор, ассоциируя переменные с значением полей текущей записи курсора.

Откат изменений из триггера:
ROLLBACK TRIGGER [WITH RAISERROR 20000 'Ошибка']

Оператор откатит изменения, сделанные на таблицу или внутри триггера, а не всю транзакцию. Если в операторе указывается ошибка, то оператор также откатит атомарный блок, если изменения таблицы шли внутри него. С учетом возможности обработки ошибок в begin ... exception ... end, я думаю этот оператор красиво вписывается в общую концепцию работы с транзакциями.
28 янв 04, 11:41    [510163]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Oracle 9.2 Неявные курсоры есть:

begin
for i in (
select * from scott.emp
) loop
dbms_output.put_line(i.empno||' '||i.ename);
end loop;
end;
/


Про UPDATE надо посмотреть конструкцию UPDATE (SELECT ...) SET ..., ИМХО нечто похожее. В триггере (и не только) можно испоьзовать автномную транзакцию.

Похоже, разработчики решают одни и те же практические задачи и вводят расширения синтаксисов T-SQL. PL/SQL и т.п. Обидно другое: все это нестандартизованно, и если сейчас еще можно, глядя на чужой запрос, как-то догадаться о его предназначении, то в дальнейшем сложность восприятия, перевода из одного диалекта в другой, одинаковой реализации для нескольких диалектов будет только возрастать.
28 янв 04, 12:41    [510373]     Ответить | Цитировать Сообщить модератору
 Re: Сравнительный анализ MS Sql и другие...  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
А в sybase такого нету:

select * from tt1
where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2)

(подзапрос по нескольким полям сразу)

create table tt1 (
id1 integer,
id2 date,
name char(35)
)
@


create table tt2 (
id1 integer,
id2 date,
name char(35)
)
@

insert into tt1 (id1,id2,name) values
(1,current date,'111111111'),
(1,current date,'2222222'),
(1,current date,'3333333'),
(1,current date,'44441'),
(2,current date,'55555'),
(2,date(days(current date)+1),'66666666'),
(3,date(days(current date)+1),'77777777777')
@


insert into tt2 (id1,id2,name) values
(1,current date,'111111111'),
(1,current date,'111111111'),
(2,date(days(current date)+1),'111111111'),
(3,date(days(current date)+2),'111111111')
@
select * from tt1

ID1 ID2 NAME
----------- ---------- -----------------------------------

1 28.01.2004 111111111
1 28.01.2004 2222222
1 28.01.2004 3333333
1 28.01.2004 44441
2 28.01.2004 55555
2 29.01.2004 66666666
3 29.01.2004 77777777777

7 record(s) selected.


select * from tt1 where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2)

ID1 ID2 NAME
----------- ---------- -----------------------------------

1 28.01.2004 111111111
1 28.01.2004 2222222
1 28.01.2004 3333333
1 28.01.2004 44441
2 29.01.2004 66666666

5 record(s) selected.


select * from tt1 where (tt1.id1,tt1.id2) not in (select tt2.id1,tt2.id2 from tt2)

ID1 ID2 NAME
----------- ---------- -----------------------------------

2 28.01.2004 55555
3 29.01.2004 77777777777

2 record(s) selected.

28 янв 04, 12:50    [510393]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить