Тип данных Rowversion

PaulWist
Дата: 29.01.2013 17:34:41
Вот такой код создаёт табличку с rowversion, а возвращается тип колонки timestamp:

create table test (f1 int, row rowversion) 
go

select col.name, col.column_id, st.name as DT_name, 
schema_name(st.schema_id) as DT_schema, col.max_length, 
col.precision, col.scale, bt.name as BT_name, col.collation_name,
 col.is_nullable, col.is_ansi_padded, col.is_rowguidcol, 
 col.is_identity, 
 case when(idc.column_id is null) then null else CONVERT(nvarchar(40), idc.seed_value) end,
  case when(idc.column_id is null) then null else CONVERT(nvarchar(40), idc.increment_value) end, 
  CONVERT(bit, case when(cmc.column_id is null) then 0 else 1 end) as is_computed,
   convert(bit, ColumnProperty(col.object_id, col.name, N'IsIdNotForRepl')) as IsIdNotForRepl,
   col.is_replicated, col.is_non_sql_subscribed, col.is_merge_published, col.is_dts_replicated,
    col.rule_object_id, robj.name as Rul_name, schema_name(robj.schema_id) as Rul_schema, 
    col.default_object_id, OBJECTPROPERTY(col.default_object_id, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name, schema_name(dobj.schema_id) as def_schema, 
    CONVERT(bit, case when (ftc.column_id is null) then 0 else 1 end) as is_FullTextCol, 
    col_name(col.object_id, ftc.type_column_id) FT_type_column, ftc.language_id as FT_language_id, 
    case when(cmc.column_id is null) then null else cmc.definition end as formular,
     case when(cmc.column_id is null) then null else cmc.is_persisted end as is_persisted, 
     defCst.definition, COLUMNPROPERTY(col.object_id, col.name, 'IsDeterministic') as IsDeterministic,
      xmlcoll.name as xmlSchema_name, schema_name(xmlcoll.schema_id) as xmlSchema_schema, 
      col.is_xml_document, col.is_sparse, col.is_column_set 
      from sys.columns col 
      left outer join sys.types st on st.user_type_id = col.user_type_id 
      left outer join sys.types bt on bt.user_type_id = col.system_type_id 
      left outer join sys.objects robj on robj.object_id = col.rule_object_id and robj.type = 'R' 
      left outer join sys.objects dobj on dobj.object_id = col.default_object_id and dobj.type = 'D' 
      left outer join sys.default_constraints defCst on defCst.parent_object_id = col.object_id 
      and defCst.parent_column_id = col.column_id 
      left outer join sys.identity_columns idc on idc.object_id = col.object_id 
      and idc.column_id = col.column_id 
      left outer join sys.computed_columns cmc on cmc.object_id = col.object_id 
      and cmc.column_id = col.column_id 
      left outer join sys.fulltext_index_columns ftc on ftc.object_id = col.object_id 
      and ftc.column_id = col.column_id 
      left outer join sys.xml_schema_collections xmlcoll
       on xmlcoll.xml_Collection_id = col.xml_Collection_id 
       where col.object_id = object_id(N'dbo.test') order by col.column_id
      go 
      drop table test
      go


Читаем в разделе Синонимы типов данных (Transact-SQL)

автор

Синоним __ Системный тип данных SQL Server
timestamp __ rowversion

Например, можно создать таблицу, указав тип national character varying:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, VarCharCol national character varying(10))

На самом деле столбцу VarCharCol при этом будет назначен тип данных nvarchar(10), и все последующие вызовы функций работы с метаданными будут сообщать, что этот столбец имеет тип nvarchar(10), а не national character varying(10).


те по хелпу тип должен вернуться как rowversion, поскольку он является системным, я правильно понимаю?

автор
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
Jul 9 2008 14:43:34
Copyright (c) 1988-2008 Microsoft Corporation
Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
iap
Дата: 29.01.2013 17:41:49
PaulWist,

ROWVERSION - это аналог сегодняшнего Microsoft TIMESTAMP, но только в ANSI SQL.
В ANSI SQL есть и TIMESTAMP, но имеет другой смысл (это время).
MS же стремится к стандарту. Для этого они объявили TIMESTAMP устаревшим типом,
планируя, наверно, однажды сказать "а наш TIMESTAMP-то совсем не то, к чему вы привыкли!"
Glory
Дата: 29.01.2013 17:42:28
А в вашем sys.types есть тип rowversion ?
PaulWist
Дата: 29.01.2013 17:50:44
iap

iap
ROWVERSION - это аналог сегодняшнего Microsoft TIMESTAMP, но только в ANSI SQL.
В ANSI SQL есть и TIMESTAMP, но имеет другой смысл (это время).
MS же стремится к стандарту. Для этого они объявили TIMESTAMP устаревшим типом,
планируя, наверно, однажды сказать "а наш TIMESTAMP-то совсем не то, к чему вы привыкли!"


Собственно имено эта фраза из хелпа меня насторожила:

автор
Синтаксис timestamp устарел. В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.


те я ожидал, что тип вернется "не устаревший"


Glory
Glory
А в вашем sys.types есть тип rowversion ?


Нету :( ... а должен быть?
Glory
Дата: 29.01.2013 17:52:39
PaulWist
Нету :( ... а должен быть?

Если его там нет, то почему ваш запрос "должен вернуть rowversion" ?
PaulWist
Дата: 29.01.2013 17:58:04
Glory
PaulWist
Нету :( ... а должен быть?

Если его там нет, то почему ваш запрос "должен вернуть rowversion" ?


1. Хорошо, приведённый запрос отловлен профайлером при открытии таблички в ManagemenyStudio, возможно он "неправильный", тогда какой системный запрос-функцию-sp_ надо выполнить, что бы вернуть rowversion?

2. И повторю вопрос, в sys.types должен быть такой тип?
Гость333
Дата: 29.01.2013 18:06:50
PaulWist
Вот такой код создаёт табличку с rowversion, а возвращается тип колонки timestamp:

+
create table test (f1 int, row rowversion) 
go

select col.name, col.column_id, st.name as DT_name, 
schema_name(st.schema_id) as DT_schema, col.max_length, 
col.precision, col.scale, bt.name as BT_name, col.collation_name,
 col.is_nullable, col.is_ansi_padded, col.is_rowguidcol, 
 col.is_identity, 
 case when(idc.column_id is null) then null else CONVERT(nvarchar(40), idc.seed_value) end,
  case when(idc.column_id is null) then null else CONVERT(nvarchar(40), idc.increment_value) end, 
  CONVERT(bit, case when(cmc.column_id is null) then 0 else 1 end) as is_computed,
   convert(bit, ColumnProperty(col.object_id, col.name, N'IsIdNotForRepl')) as IsIdNotForRepl,
   col.is_replicated, col.is_non_sql_subscribed, col.is_merge_published, col.is_dts_replicated,
    col.rule_object_id, robj.name as Rul_name, schema_name(robj.schema_id) as Rul_schema, 
    col.default_object_id, OBJECTPROPERTY(col.default_object_id, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name, schema_name(dobj.schema_id) as def_schema, 
    CONVERT(bit, case when (ftc.column_id is null) then 0 else 1 end) as is_FullTextCol, 
    col_name(col.object_id, ftc.type_column_id) FT_type_column, ftc.language_id as FT_language_id, 
    case when(cmc.column_id is null) then null else cmc.definition end as formular,
     case when(cmc.column_id is null) then null else cmc.is_persisted end as is_persisted, 
     defCst.definition, COLUMNPROPERTY(col.object_id, col.name, 'IsDeterministic') as IsDeterministic,
      xmlcoll.name as xmlSchema_name, schema_name(xmlcoll.schema_id) as xmlSchema_schema, 
      col.is_xml_document, col.is_sparse, col.is_column_set 
      from sys.columns col 
      left outer join sys.types st on st.user_type_id = col.user_type_id 
      left outer join sys.types bt on bt.user_type_id = col.system_type_id 
      left outer join sys.objects robj on robj.object_id = col.rule_object_id and robj.type = 'R' 
      left outer join sys.objects dobj on dobj.object_id = col.default_object_id and dobj.type = 'D' 
      left outer join sys.default_constraints defCst on defCst.parent_object_id = col.object_id 
      and defCst.parent_column_id = col.column_id 
      left outer join sys.identity_columns idc on idc.object_id = col.object_id 
      and idc.column_id = col.column_id 
      left outer join sys.computed_columns cmc on cmc.object_id = col.object_id 
      and cmc.column_id = col.column_id 
      left outer join sys.fulltext_index_columns ftc on ftc.object_id = col.object_id 
      and ftc.column_id = col.column_id 
      left outer join sys.xml_schema_collections xmlcoll
       on xmlcoll.xml_Collection_id = col.xml_Collection_id 
       where col.object_id = object_id(N'dbo.test') order by col.column_id
      go 
      drop table test
      go

Задлянафига тут эта портянка? :-)
Можно же было выделить и запостить суть:
create table test (f1 int, row rowversion) 
go
select col.name, col.column_id, st.name as DT_name,
       schema_name(st.schema_id) as DT_schema, bt.name as BT_name
from sys.columns col 
     left outer join sys.types st on st.user_type_id = col.user_type_id 
     left outer join sys.types bt on bt.user_type_id = col.system_type_id 
where col.object_id = object_id(N'dbo.test') order by col.column_id
go 
drop table test
go


PaulWist
2. И повторю вопрос, в sys.types должен быть такой тип?

В sys.types не могут быть одновременно и rowversion, и timestamp (раз уж это синонимы). Разработчики оставили timestamp, а писатели документации говорят, что основной тип — rowversion, ну такая вот накладка произошла, для больших продуктов это неизбежно.
Glory
Дата: 29.01.2013 18:07:28
PaulWist
1. Хорошо, приведённый запрос отловлен профайлером при открытии таблички в ManagemenyStudio, возможно он "неправильный", тогда какой системный запрос-функцию-sp_ надо выполнить, что бы вернуть rowversion?

Вернуть откуда ? Опять из таблицы sys.types ? Или вообще откуда-нибудь ?

PaulWist
2. И повторю вопрос, в sys.types должен быть такой тип?

Нигде нет списка, что там должно быть, а чего не должно.
Это метаданные. Без них сервер может замечательно прожить.
PaulWist
Дата: 29.01.2013 18:18:58
Гость333
Задлянафига тут эта портянка? :-)
Можно же было выделить и запостить суть:

В sys.types не могут быть одновременно и rowversion, и timestamp (раз уж это синонимы). Разработчики оставили timestamp, а писатели документации говорят, что основной тип — rowversion, ну такая вот накладка произошла, для больших продуктов это неизбежно.


1. Выдернул "как есть", а чЁ нибудь забыл :)

2. ОК, спасибо за коммент, будем считать, что в метаданных написано вместо timestamp - rowversion.

ЗЫ Мы говорим партия подразумеваем Ленин, мы говорим .... :)


Glory
Glory
Вернуть откуда ? Опять из таблицы sys.types ? Или вообще откуда-нибудь ?


Э-э-э, из метаданных сервера, ... Ваш вопрос:

автор
Если его там нет, то почему ваш запрос "должен вернуть rowversion" ?


я понял, что запрос посылаемый ManStudio является "кривым" и есть более "правильный" запрос, поэтому написал уточняющий пост.

PS Ну собственно Гость333 уже ответил по делу.
Glory
Дата: 29.01.2013 18:23:44
PaulWist
Э-э-э, из метаданных сервера, ... Ваш вопрос:

ну так в таблице метаданных sys.types нет такого типа

PaulWist
я понял, что запрос посылаемый ManStudio является "кривым" и есть более "правильный" запрос, поэтому написал уточняющий пост.

Нет "секретных" метаданных. Серверу они не нужны.