Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Rowtype  [new]
Начиналкин
Guest
Можно ли, задвая тип данных входящего параметра хранимки сделать это ссылкой на тип данных поля таблицы?
Если да, то как? Синтаксис
30 сен 09, 22:16    [7727437]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ээ .. не очень понял, но UDT - не оно?
30 сен 09, 23:12    [7727580]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Tako
Member

Откуда:
Сообщений: 65
Что то мне подсказывает, что не подойдет это автору, т.к. насколько понимаю ему нужна возможность менять тип данных столбца, и чтобы в других местах эти изменения автоматически подхватывались. С UDT такое не пройдет (или есть команда alter type, и я о ней не знаю?)
30 сен 09, 23:53    [7727641]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Возврат динамически созданной таблицы?
CREATE PROC Test ( @Type SysName ) AS EXEC ('SELECT Convert(' + @Type + ', 0'));
GO
EXEC Test 'Money'
EXEC Test 'VarChar(20)'
В EXEC можно и DECLARE @Table TABLE написать. :)

B зачем вам такой изврат?
А ещё есть такой тип как SQL_Variant.
1 окт 09, 01:51    [7727743]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Начиналкин
Guest
Да, похоже, что SQL_Variant это выход, но использовать такой тип как и в любом другом языке наверно не очень желательно все-таки...
Просто думал, может в МС СКЛ тоже есть такая фича очень удобно все-таки...
Например в оракле можно объявить переменную типа запись и сразу сказать, что запись будет такого же типа как вооон в той табличке:
MyRow Mytable%RowType;
Или как уже говорил, можно привязать тип переменной к типу определенонго поля таблицы
MyVarLikeAField Mytable.MyFieldName%Type;
1 окт 09, 10:17    [7728201]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Подскажите пожалуйста, есть ли в SQL Server 2005 аналог %rowtype(oracle), чтобы не объявлять кучу переменных для для каждого поля таблицы при использования курсоров?
8 июн 11, 12:04    [10781703]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Владимир37,

А что он делает этот аналог в оракле?
да и зачем вобще курсоры использовать?
8 июн 11, 12:12    [10781778]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
WarAnt,
%rowtype в oracle позволяет объявить переменну, и она будет иметь тип строка таблицы (примерно так: VarRow%rowtype). далее, чтобы обратиться к отдельному полю таблицы, нужно написать VarRow.FieldName.
В моих задачах без курсоров не обойтись.
8 июн 11, 12:34    [10781974]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Нет такого, придется делать кучу переменных. Или таки убирать курсор.
8 июн 11, 12:36    [10781990]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Владимир37
WarAnt,
%rowtype в oracle позволяет объявить переменну, и она будет иметь тип строка таблицы (примерно так: VarRow%rowtype). далее, чтобы обратиться к отдельному полю таблицы, нужно написать VarRow.FieldName.
В моих задачах без курсоров не обойтись.


нету такого в mssql но и курсоры тут никто в здравом уме не использует:)
8 июн 11, 12:37    [10782011]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Немножко не правильно написал, надо так: VarRow TableName%rowtype. Примерно, так. Точно не помню
8 июн 11, 12:38    [10782019]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
WarAnt,
хорошо. Тогда как обойтись без курсоров. Например мне надо сделать выборку из таблицы и циклом пройтись по строкам, делая различные сложные расчеты.
8 июн 11, 12:41    [10782035]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир37
Например мне надо сделать выборку из таблицы и циклом пройтись по строкам, делая различные сложные расчеты.

Настолько сложные, что их нельзя сделать запросом ?
8 июн 11, 12:42    [10782049]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Glory,
Я думар об этом, но запросом никак.
8 июн 11, 12:45    [10782080]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
При пробежке по результатам выборки могут еще производитья вставки строк в различные таблицы или изменения записей (вставка или изменение могут быть соответственно, если записи нет или есть)
8 июн 11, 12:48    [10782089]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Владимир37
При пробежке по результатам выборки могут еще производитья вставки строк в различные таблицы или изменения записей (вставка или изменение могут быть соответственно, если записи нет или есть)
Вы не поверите, но mssql может вставлять и апдейтить более, чем по одной записи за раз.
8 июн 11, 12:49    [10782100]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Гавриленко Сергей Алексеевич,
Вы не понимаете, обновление и вставка происходят в зависимости от данных в выбранной строке. Причем при расчетах могут браться данные из другой таблицы, а может и не браться.
8 июн 11, 12:55    [10782160]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Владимир37
Гавриленко Сергей Алексеевич,
Вы не понимаете, обновление и вставка происходят в зависимости от данных в выбранной строке. Причем при расчетах могут браться данные из другой таблицы, а может и не браться.
Это вы не понимаете. В запросах на вставку или обновление в секции from можно использовать более одной таблицы.
8 июн 11, 12:57    [10782181]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир37
Вы не понимаете, обновление и вставка происходят в зависимости от данных в выбранной строке. Причем при расчетах могут браться данные из другой таблицы, а может и не браться.

И что нельзя все такие строки сразу отфильтровать через where ?
А другие - через другое where ?
8 июн 11, 12:59    [10782197]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Владимир37,

разложите все ваши хотелки на разные запросы и сделайте их по очереди, не вижу тут трудностей. Ну на крайний случай всегда есть возможность использовать временные таблицы куда сваливать данные и потом там их преобразовывать до нужной неузнаваемости. А курсоры это бест практис для оракла но не для скуля.
8 июн 11, 13:03    [10782229]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Например есть такой скрипт(просто для примера):
declare @Table1ID int, @i int
set @i=0
declare MyCurs cursor for select ID from dbo.Table1
open MyCurs
fetch next from MyCurs into @Table1ID
while @@fetch_status=0
 begin
  if exists(select * from dbo.Table2 where Table1ID=@Table1ID) update dbo.Table2 set Table2Field=1
  else 
   begin
    insert into dbo.Table2 (Table1ID,Table2Field) values (@Table1ID,0)
    set @i=@i+1;
   end
  
  fetch next from MyCurs into @Table1ID
 end
close MyCurs
deallocate MyCurs
select @i
Как его можно сделать через запросы? Подскажите пожалуйста.

Сообщение было отредактировано: 8 июн 11, 13:28
8 июн 11, 13:13    [10782314]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Вариант 1:
merge dbo.Table2 t
using dbo.Table1 s on s.Table1ID = t.ID
when not matched then
 insert (Table1ID, Table2Field) values (s.ID, 0)
when matched then
 update set Table2Field = 1;
Вариант 2:
update t
 set
  Table2Field = 1
from
 dbo.Table2 t join 
 dbo.Table1 s on s.Table1ID = t.ID
 
insert into dbo.Table2
 (Table1ID, Table2Field)
 select
  s.ID, 0
 from
  dbo.Table1 s
 where
  not exists(select * from dbo.Table2 where Table1ID = s.ID)
8 июн 11, 13:27    [10782432]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
Владимир37
Как его можно сделать через запросы? Подскажите пожалуйста.
Ну вы даёте, такое делать через курсоры :-)

update t12
set Table2Field=1
from dbo.Table2 t2
	join dbo.Table1 t2
		on t1.ID = t2.Table1ID

insert into dbo.Table2 (Table1ID, Table2Field) 
select ID, 0
from dbo.Table1 t1
where not exists(select * from dbo.Table2 t2 where t1.ID = t2.Table1ID)
8 июн 11, 13:29    [10782445]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
Всем спасибо.
8 июн 11, 13:44    [10782597]     Ответить | Цитировать Сообщить модератору
 Re: Rowtype  [new]
Владимир37
Member

Откуда: Иваново
Сообщений: 55
еще один вопрос, а если надо вызвать процедуру для каждой строки выборки, передавая ей в качестве параметров значение одного или нескольких полей строки выборки.
8 июн 11, 13:47    [10782640]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить