Аннотация:
Q. Хотелось бы узнать есть ли принципиальная разница между этими двумя путями. И если есть, то какая?
A. Разница есть. но незначительная...
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, KGP, Вы писали:
KGP>Что это за цикл? С чем его едят?
пример:
а вот я хочу программно построить запрос к некоторой таблице, который вернет мне только поля некоторого типа.
declare @table_name varchar(128)
declare @type_name varchar(128)
set @table_name = '_main'
set @type_name = 'int'
declare @st varchar(8000)
----------------------------------------------
-- это мой цикл:set @st = 'select '
select @st = @st + sc.name + ', ' from syscolumns sc
inner join sysobjects so on lower(so.name) = lower(@table_name) and so.id = sc.id
inner join systypes st on st.xusertype = sc.xusertype and lower(@type_name) = lower(st.name)
----------------------------------------------
-- а это тоже самое с использованием курсора:declare @name varchar(128)
set @st = 'select '
DECLARE cur CURSOR FOR
select sc.name
from syscolumns sc
inner join sysobjects so on lower(so.name) = lower(@table_name) and so.id = sc.id
inner join systypes st on st.xusertype = sc.xusertype and lower(@type_name) = lower(st.name)
OPEN cur
FETCH NEXT FROM cur INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @st = @st + sc.name + ', '
FETCH NEXT FROM cur INTO @name
END
CLOSE cur
DEALLOCATE cur
----------------------------------------------set @st = left(@st, len(@st)-1) + ' from ' + @table_name
print @st
exec (@st)
... << RSDN@Home 1.1 beta 2 >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re: Q&A: Set и Select
От:
Аноним
Дата:
15.07.07 10:05
Оценка:
Здравствуйте, Дмитрий Полюдов, Вы писали:
Конструкция
set @id = (select id from <table> )
обломится, если в возвращенном наборе данных больше 1 записи, а select – сработает, да и читается (по моему мнению) select попроще.
а что мешает добавить "top 1"?
самое интересное то, что констукция с select, без указания top 1 вернет последнее значение
declare @id int
declare @table table( id int identity primary key, field varchar(4) )
insert into @table (field)
select 'AAAA'
union all select 'BBBB'
union all select 'CCCC'
union all select 'BBBB'
union all select 'AAAA'
set @id = (select top 1 id from @table where field = 'AAAA')
print @id
select @id = id from @table where field = 'AAAA'
print @id
select top 1 @id = id from @table where field = 'AAAA'
print @id
Здравствуйте, MasterZiv, Вы писали:
MZ>Здравствуйте, Дмитрий Полюдов, Вы писали:
MZ>4 и 5 неверно.
MZ>Одно значение должно быть в подзапросе и в случае SELECT-а.
рекомендую проверитью и отписаться о результатах.
MZ>5 — такой "цикл" не будет работать в принципе, потому что нет способов задать порядок MZ>вычислений.
работать будет. порядок вычислений задается директивой "order by". рекомендую проверитью и отписаться о результатах.
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
_MarlboroMan_ пишет:
> работать будет. порядок вычислений задается директивой "order by".
Это — твои мечты. ORDER BY — порядок следования записей в результирующем
наборе, а не порядок вычисления этих записей. Они могут отличаться.
А второй порядок не задается никак, если ты не форсируешь план запроса.
Здравствуйте, MasterZiv, Вы писали: MZ>Это — твои мечты. ORDER BY — порядок следования записей в результирующем MZ>наборе, а не порядок вычисления этих записей. Они могут отличаться.
Неправда. Вот смотри:
select a from table order by id
никакой неопределенности не вызывает, так?
теперь вот так:
select @a+a from table order by id
тоже все однозначно?
Вот и в
select @a=@a+a from table order by id
никаких проблем нет.
Потому, что вычисления выражений с переменными делается именно в результирующем наборе. Так устроен сервер; никаких форсирований плана тут не надо.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Sinclair пишет:
> Потому, что вычисления выражений с переменными делается именно в > результирующем наборе. Так устроен сервер; никаких форсирований плана > тут не надо.
Включи парралельное выполнение запросов — посмотрим.