Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 странное поведение select  [new]
vv40in
Member

Откуда:
Сообщений: 122
всё оч.просто.
mssql2005,
табица:
CREATE TABLE [dbo].[T_table]([id] [int] IDENTITY(1,1) NOT NULL,txt [nvarchar](64) NOT NULL,
CONSTRAINT [PK_T_table] PRIMARY KEY CLUSTERED ([id] ASC))
conn.string:
Integrated Security=SSPI;Persist Security Info=False;DataTypeCompatibility=80;Data Source=<name>;Initial Catalog=<name>;MultipleActiveResultSets='true';Provider=SQLOLEDB.1;

я вызываю хранимую процедуру из ADO множество раз.
в ней содержится два варианта запрса:
select @id = (select [id] from T_table where txt=@txt);--всегда работает правильно
и
select @id = [id] from T_table where txt=@txt;--не работает
затем идет проверка:
if (@id is null) begin-- вставить @txt  
  INSERT INTO T_table (TXT) VALUES(@txt);
  SELECT @id = @@IDENTITY;
end

1ый вариант работает нормально, а 2ой - работает только 1 раз после создания соединения.
т.е. в случае если @txt есть в таблице, то @id верно, иначе - любое значение в пределах существующих значений id в таблице. и никаких ошибок и исключений не сыплет.

а вот если сделать так:
select @id=[id],@tout=txt from T_table where txt=@txt;
то @t содержит честное значение, т.е. если @tout есть в словаре, то @tout=@txt (@id тоже правильно), иначе - @tout=NULL, а @id - тот же самый мусор .

Если в таблице есть строки, то если выполнить truncate во время работы программы, то @id возвращает значения из того же самого промежутка id, что был до truncate, а @txt всегда возвращает NULL

объясните, пожста, что за йня?? у меня баг или у mssql?
select @id = [id] from вроде должно работать...
заранее спасибо
5 ноя 09, 11:18    [7884336]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
Glory
Member

Откуда:
Сообщений: 104760
А что такое ваше запрос "не работает" ?
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt не затронет ни одной записи, то в переменной будет ее предыдущее значение ?
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt затронет множество записей, то в переменной будет значение случайной записи ?
5 ноя 09, 11:22    [7884375]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
vv40in

объясните, пожста, что за йня?? у меня баг или у mssql?
заранее спасибо

ошибки смотрим это раз,
йня в том, что в @id может содержаться одно значения
баг - в говнокоде


DECLARE  @T_table TABLE
(
 [id] [int] IDENTITY(1,1) ,txt [nvarchar](64) COLLATE Cyrillic_General_CS_AI-- какой коллейшн у DB ?
)

--DECLARE  @T_table TABLE
--(
-- [id] [int] IDENTITY(1,1) ,txt [nvarchar](64) COLLATE Cyrillic_General_CI_AI-- какой коллейшн у DB ?
--)

insert @T_table (txt)
select N'Раз' union all 
select N'РаЗ' union all 
select N'два' 


declare @id int
declare @txt [nvarchar](64)

SET @txt = N'Раз'


select [id] from @T_table where txt=@txt

select @id = (select [id] from @T_table where txt=@txt);--всегда работает правильно
select @id

select @id = [id] from @T_table where txt=@txt;--не работает
select @id 

if (@id is null) begin-- вставить @txt  
  INSERT INTO @T_table (TXT) VALUES(@txt);
  SELECT @id = @@IDENTITY;
end


5 ноя 09, 11:35    [7884483]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
vv40in
Member

Откуда:
Сообщений: 122
Ken@t
объясните, пожста, что за йня?? у меня баг или у mssql?
ошибки смотрим это раз,
йня в том, что в @id может содержаться одно значения
баг - в говнокоде

можно поподробнее? что, также, значит "в @id может содержаться одно значения"?

Ken@t
DECLARE @T_table TABLE
( [id] [int] IDENTITY(1,1) ,txt [nvarchar](64) COLLATE Cyrillic_General_CS_AI-- какой коллейшн у DB ?
)

у меня COLLATE Cyrillic_General_CI_AS. результат не зависит от слов. это м.б. чИсла (0,1,2,..)


Glory
А что такое ваше запрос "не работает" ?

значит, что процедура нармально выполняется так:
create PROCEDURE p_insert_word
 @txt nvarchar(64), @id int = NULL OUTPUT
AS BEGIN
	SET NOCOUNT ON;
	select @id = (select [id] from T_table where txt=@txt);
	--бредово себя ведет select @id = [id] from T_table where txt=@txt;
	if (@id is null)
	begin
		INSERT INTO T_table (TXT) VALUES(@txt);
		SELECT @id = @@IDENTITY;
	end
END
а если первый селект убрать и раскоментарить второй, то см поведение описаное в моём письме.

Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt не затронет ни одной записи, то в переменной будет ее предыдущее значение ?

какое пред.значение? это стековая переменная. и разве она не должна возвратить NULL в таком случае?

Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt затронет
множество записей, то в переменной будет значение случайной записи ?

у меня точно нет дубликатов поля txt
5 ноя 09, 13:14    [7885465]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vv40in
что, также, значит "в @id может содержаться одно значения"?
А сколько по-Вашему?
5 ноя 09, 13:17    [7885480]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
Glory
Member

Откуда:
Сообщений: 104760
vv40in

а если первый селект убрать и раскоментарить второй, то см поведение описаное в моём письме.

Если нет сообщения об ошибке, то код делает именно то, что написали
И если вам кажется, что он работает неверно, то значит, вы написали неверный код

vv40in

Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt не затронет ни одной записи, то в переменной будет ее предыдущее значение ?

какое пред.значение? это стековая переменная. и разве она не должна возвратить NULL в таком случае?

Предыдущее значит то значение, что было до выполнения запроса

vv40in

Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt затронет
множество записей, то в переменной будет значение случайной записи ?

у меня точно нет дубликатов поля txt

Честное пионерское нет ? Может у вас там уникальное ограничение задано по этому полю ?
5 ноя 09, 13:17    [7885487]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vv40in
у меня точно нет дубликатов поля txt
Зуб даёте?
А по CREATE TABLE этого не скажешь...
5 ноя 09, 13:20    [7885509]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
vv40in
Member

Откуда:
Сообщений: 122
Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt не затронет ни одной записи, то в переменной будет ее предыдущее значение ?

каж-ся я понял. в случае
select @id = [id] from T_table where txt=@txt
если нет результатов, то @id неопределено (остается прежном значением)

а
select @id = (select [id] from T_table where txt=@txt)
возвращает реальное id, и если ничего не найдено, то @id=NULL

так?
5 ноя 09, 13:23    [7885530]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
Glory
Member

Откуда:
Сообщений: 104760
vv40in
Glory
А вы знаете, что если запрос select @id = [id] from T_table where txt=@txt не затронет ни одной записи, то в переменной будет ее предыдущее значение ?

каж-ся я понял. в случае
select @id = [id] from T_table where txt=@txt
если нет результатов, то @id неопределено (остается прежном значением)

а
select @id = (select [id] from T_table where txt=@txt)
возвращает реальное id, и если ничего не найдено, то @id=NULL

так?

Бинго !
5 ноя 09, 13:25    [7885545]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение select  [new]
vv40in
Member

Откуда:
Сообщений: 122
iap
vv40in
у меня точно нет дубликатов поля txt
Зуб даёте?
А по CREATE TABLE этого не скажешь...

точно. там еще уникальный индекс по txt
5 ноя 09, 13:25    [7885548]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить