powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие...
25 сообщений из 82, страница 2 из 4
Сравнительный анализ MS Sql и другие...
    #32388998
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky
Давай сюды твой запрос)).. хочеца заняцца творчеством...))
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389060
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2gardenman
Код: plaintext
1.
select @@microsoftversion

:-)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389470
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хе хе. Ну если СУБД поддерживает глобальные переменные, то MSSQL победим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 -- Процедура инициализации подключения сессии
 
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 :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389487
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
Догадливые, блин... думал, задачка дольше продержится :-)
Хотя, если подходить формально, то результат - неправильный :-)
У меня в @@microsoftversion судя по всему лежит какая-та внутренняя версия. В BOL описания нету :-(
А ваще-та, всегда не любил Sybase за то, что там есть то, что мне иногда надо, а в MS SQL этого нету :-(
В частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389510
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из МСДН

if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389533
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyВ частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.
Есть, есть :) Называется глобальные временные таблицы. Достаточно один раз создать, описание хранится в БД, а каждая подключаемая сессия ее видит как собственную, с своими данными и никаких проблем с разделением по сессиям и блокировками. Можно ее еще сделать как NOT TRANSACTIONAL в целях ускорения операций так сказать :) Еще в ASA можно делать вычисляемые поля на UDF, а по ним строить индексы, или в триггерах BEFORE изменять значения полей, TRUNCATE на таблицы с FOREIGN KEY и триггерами. А еще ...... она и на швейной машинке работать умеет :)

P.S.Будем надеятся, что все таки новый MSSQL оправдает надежды и пусть не все, но многое дополнит к своей функциональности. Иногда такие мелочи довольно таки приятны при проектировке БД.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389611
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389631
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 gardenman
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @BirthDate datetime,
	@vCurrentDate datetime

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

print @BirthDate
print @vCurrentDate

select datediff(dd, @BirthDate, @vCurrentDate)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389633
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SET DATEFORMAT dmy

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


или я че не понял?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389636
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
Oracle :)

Код: plaintext
1.
2.
3.
4.
5.
6.
   1 * select sysdate - to_date('14/09/1966', 'dd/mm/yyyy') as days  from dual
SQL> /

      DAYS
 ----------
 
 13649 , 7119 
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389640
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA
Код: plaintext
select Now() - convert(date, '19660914')

ответ: 13649
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389644
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это видно был тест - на что я правда не понял...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389665
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как я понял конкурс на "слабо" :) А вот такое слабо красивым кодом написать на других СУБД:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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).
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389699
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
Oracle :)

Код: plaintext
1.
2.
3.
SELECT * FROM ALL_TAB_COLUMNS
where owner='MY_OWNER' and table_name='MY_TABLE'
and data_type='VARCHAR2' ;
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389731
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389740
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше конечно
Код: plaintext
1.
set @S = 'select '+(case when @S='' then '''нету''' else @S end)+' from '+@n
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389766
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
И нетранзакционность есть? Класс... еще больше ненавижу... Если при этом еще и индексы поддерживаются на таких таблицах... В Informix, по моим сведениям, тоже можно сделать нетранзакционные таблицы, но там несколько ограничений (вроде как нельзя на таких таблицах делать индексы).
А фича полезная....
Я как-то с горя пожаловался в форуме на то, что в MS SQL нельзя отключить transaction log, так чуть не съели, сказали что это неправильно... что всё должно логгироваться и всё такое...
А truncate и в MS SQL можно организовать, токо там приходится править системную таблицу для этого... так что это так - выверт :-(
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389871
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky
"Нетранзакционность" на глобальные временные таблицы есть. И индексы есть, в том числе можно и кластерный сделать. А заодно для полного счастья можно полноценна триггера BEFORE и AFTER повесить, хотя это выглядит забавно для временной сессионной таблицы.

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

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

Меня лично порадовали следующие расширения SQL в ASA. Интересно у кого есть аналоги:
KEY JOIN - связь таблиц по FOREIGN KEY:
Код: plaintext
1.
2.
select *
from Table1
  key left join Table2

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

Расширенный INSERT
Код: plaintext
1.
2.
3.
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 части:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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:
Код: plaintext
1.
2.
3.
4.
5.
6.
begin atomic
  insert ...
  update ...
  delete ...
exception
  when others then resignal
end

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

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

Интересно было бы узнать, у кого в других СУБД есть интересные расширения SQL ?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389920
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman> Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...

А вот кто решит такую задачку на DB2?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390138
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 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.

...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390195
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, хотя скорее всего были и раньше.

Дополнительно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 месяца
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390334
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 gardenman

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

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

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

В остальном DB2 произвел очень хорошее впечатление.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390366
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМое личное мнение - от лукавого эти скрытые соответствия:) Теоретически между двух таблиц может существовать несколько ссылочных ограничений, а с другой стороны - имена полей в них необязательно совпадают.
Угу, в ASA тоже есть NATURAL JOIN, только я не стал их приводить как раз по той причине, что это от лукавого. KEY JOIN в отличие от NATURAL JOIN как раз однозначно определяет связь таблиц по существующему FOREIGN KEY (если его нет, то естественно будет возбуждена ошибка).

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

Расширенный UPDATE:
Код: plaintext
1.
2.
update top  100  Table1
set Field1 =  1 
order by Field2


Организация цикла FOR по курсору:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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 и соотвествующе последовательно перебирает весь курсор, ассоциируя переменные с значением полей текущей записи курсора.

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

Оператор откатит изменения, сделанные на таблицу или внутри триггера, а не всю транзакцию. Если в операторе указывается ошибка, то оператор также откатит атомарный блок, если изменения таблицы шли внутри него. С учетом возможности обработки ошибок в begin ... exception ... end, я думаю этот оператор красиво вписывается в общую концепцию работы с транзакциями.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390520
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 9.2 Неявные курсоры есть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 и т.п. Обидно другое: все это нестандартизованно, и если сейчас еще можно, глядя на чужой запрос, как-то догадаться о его предназначении, то в дальнейшем сложность восприятия, перевода из одного диалекта в другой, одинаковой реализации для нескольких диалектов будет только возрастать.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390532
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в sybase такого нету:

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

(подзапрос по нескольким полям сразу)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
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.

...
Рейтинг: 0 / 0
25 сообщений из 82, страница 2 из 4
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]