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

Откуда:
Сообщений: 23
добрый вечер.

Извиняюсь за "многобукв".

Есть клиентское приложение, которое вызывает процедуру newParticipant на SQL server'e. До последнего времени все отрабатывало нормально. Вчера, почему-то процедура отрабатывать перестала(т.е. пользователь видит, что нет соответствующего результата). Пытаясь понять в чем проблема, смотрю через профайлер. Там есть следующий вызов интересующей процедуры:

declare @P1 int
set @P1=0
declare @P2 int
set @P2=16388
declare @P3 int
set @P3=8193
declare @P4 int
set @P4=0
exec sp_cursoropen @P1 output, N'exec newParticipant ''qwer'',''qwer'',''qwer'',''1900.01.01'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer''', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4

Копирую его в QA и запускаю. получаю следующее:
The command(s) completed successfully.
однако ожидаемого результата работы процедуры нет. При этом запуск самой команды
exec newParticipant 'qwer','qwer','qwer','1900.01.01','qwer','qwer','qwer','qwer','qwer','qwer','qwer'
даёт нужный результат.

Для того, чтобы лишний раз убедится, что я ничего не путаю, создаю тестовую табличку и изменяю код процедуры до самого простого (чтобы избежать ошибок при выполнении процедуры)

create table testtable ([a] [integer])

GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

ALTER          PROCEDURE [dbo].[newParticipant] 
@FirstNameParticipantRus varchar(200),
@MiddleNameParticipantRus varchar(200), 
@LastNameParticipantRus varchar(200), 
@BirthdayParticipant varchar(20), 
@FirstNameParticipantEng varchar(200), 
@MiddleNameParticipantEng varchar(200), 
@LastNameParticipantEng varchar(200), 
@EMailParticipant varchar(100), 
@NameAccount varchar(200), 
@ContactFaceAccount varchar(200), 
@PhoneContactFaceAccount varchar(150)
AS

insert into testTable
select 1

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

теперь выполняем
declare @P1 int
set @P1=0
declare @P2 int
set @P2=16388
declare @P3 int
set @P3=8193
declare @P4 int
set @P4=0
exec sp_cursoropen @P1 output, N'exec newParticipant ''qwer'',''qwer'',''qwer'',''1900.01.01'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer''', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4

и

 Select * from testtable

получаем

a           
----------- 

(0 row(s) affected)
, т.е. таблица пуста.

и опять, если выдрать только строчку
exec newParticipant 'qwer','qwer','qwer','1900.01.01','qwer','qwer','qwer','qwer','qwer','qwer','qwer'
и запустить её, то

 Select * from testtable
вернёт
a           
----------- 
1

(1 row(s) affected)

честно признаюсь, даже не представляю, в какую сторону копать. Почему через sp_cursoropen процедура не работает? Если я написал не всё, что нужно, то обязательно дополню. Поиск по форуму ничего не дал, но может я плохо искал. Буду очень признателен за ссылку на аналогичную проблему.

версия сервера:
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
	May  3 2005 23:18:38 
	Copyright (c) 1988-2003 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

P.s.
делаю бэкап базы. разворачиваю на другом компе и сервере. инсталирую тоже клиенсткое приложение. Всё работает замечательно. Процедура выполняется обоими способами.

Означает ли это, что проблема в настройках сервера? Если да, то какие настройки могут тут быть задействованы?

Второй сервер такой:
Microsoft SQL Server  2000 - 8.00.194 (Intel X86) 
	Aug  6 2000 00:57:48 
	Copyright (c) 1988-2000 Microsoft Corporation
	Personal Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

Заранее благодарен за любые советы.
31 авг 08, 23:55    [6129880]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Glory
Member

Откуда:
Сообщений: 104751
'1900.01.01' - это вы так дату передаете ?
1 сен 08, 12:03    [6131141]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Aleah
Member

Откуда:
Сообщений: 23
Glory
'1900.01.01' - это вы так дату передаете ?


Не могу сказать, что это именно моё творчество, но так передаётся дата. К сожалению ХП не под рукой, чтобы посмотреть на неё (вечером отпишу конкретнее), но по-моему в ней идет обработка и превращение строки в дату вида "yyyymmdd". Если обратите внимание на параметры передаваемые в ХП

@BirthdayParticipant varchar(20) 

это передается как строка, а не как дата.

я тоже думал сначала, что в этом косяк, но от такой мысли меня оттолкнули три факта:

1) без использования sp_cursoropen всё нормально работает, т.е.
exec newParticipant 'qwer','qwer','qwer','1900.01.01','qwer','qwer','qwer','qwer','qwer','qwer','qwer'
выполняется без проблем даже с такой "датой"

2) на другом сервере все работает ок (я сверял региональные настройки windows на обоих компах - совпадают).

3) даже если просто передавать параметры в процедуру, но их не использовать, т.е. выполнять только упрощенный вариант процедуры
insert into testTable
select 1
Ошибка повторяется на одном сервере и не повторяется на другом.

Из этих трех пунктов пришел к выводу, что косяк не в дате. Может, тут есть какая-то ошибка в рассуждениях?

Спасибо за внимание к вопросу.
1 сен 08, 12:24    [6131275]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Glory
Member

Откуда:
Сообщений: 104751
1. Результат преобразования строки в дату зависит от установки SET DATEFORMAT, которая в свою очередь зависит от языка логина

2. Если есть ошибка, то где полное сообщение о ней ?
1 сен 08, 12:27    [6131293]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Aleah
Member

Откуда:
Сообщений: 23
Glory
1. Результат преобразования строки в дату зависит от установки SET DATEFORMAT, которая в свою очередь зависит от языка логина


Спасибо. я обязательно это проверю, но признаюсь, никак не могу понять, как может быть проблема с преобразованием влиять на ход выполнения вот такой ХП. (ведь тут нигде дата не используется, а передается строка).

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

ALTER          PROCEDURE [dbo].[newParticipant] 
@FirstNameParticipantRus varchar(200),
@MiddleNameParticipantRus varchar(200), 
@LastNameParticipantRus varchar(200), 
@BirthdayParticipant varchar(20), 
@FirstNameParticipantEng varchar(200), 
@MiddleNameParticipantEng varchar(200), 
@LastNameParticipantEng varchar(200), 
@EMailParticipant varchar(100), 
@NameAccount varchar(200), 
@ContactFaceAccount varchar(200), 
@PhoneContactFaceAccount varchar(150)
AS

insert into testTable
select 1

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Но в любом случае ещё раз спасибо. проверю и протестирую этот вопрос.

автор
2. Если есть ошибка, то где полное сообщение о ней ?


Glory, в том-то и история, что никакого сообщения об ошибке нет. Как уже писал в первом посте:

declare @P1 int
set @P1=0
declare @P2 int
set @P2=16388
declare @P3 int
set @P3=8193
declare @P4 int
set @P4=0
exec sp_cursoropen @P1 output, N'exec newParticipant ''qwer'',''qwer'',''qwer'',''1900.01.01'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer''', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4

Копирую его в QA и запускаю. получаю следующее:

The command(s) completed successfully.

т.е. ошибки нет, но при этом таблица testtable остаётся пустой. ошибки нет. А insert не происходит. я понимаю, что "все экстрасенсы в отпуске" и без сообщения об ошибке очень сложно понять в чем проблема, но я действительно описываю то, что происходит. Будь сообщение об ошибке, было бы намного проще жить.

Кстати, обратил внимание вот ещё на что. На втором сервере (где все работает хорошо) по вышеуказанному запросу возвращаются значения @P1, @P2, @P3, @P4, т.е. отрабатывает строчка
select @P1, @P2, @P3, @P4
, в то время как на проблемном сервере всё огранчивается вышеприведенной фразой об успешном выполнении команд(ы).
1 сен 08, 12:44    [6131391]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Glory
Member

Откуда:
Сообщений: 104751
Если ошибки нет, то значит ошибка в логике вашей процедуры
1 сен 08, 12:45    [6131403]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Aleah
Member

Откуда:
Сообщений: 23
Glory
Если ошибки нет, то значит ошибка в логике вашей процедуры


я верил в это ровно того момента, пока не заменил процедуру на

 insert into testTable
select 1 

согласитесь, тяжело поверить, что в этих двух строчках есть "ошибка в логике".

версия с ошибкой в логике так и не отвечает на вопросы,

1) почему

declare @P1 int
set @P1=0
declare @P2 int
set @P2=16388
declare @P3 int
set @P3=8193
declare @P4 int
set @P4=0
exec sp_cursoropen @P1 output, N'exec newParticipant ''qwer'',''qwer'',''qwer'',''1900.01.01'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer'',''qwer''', @P2 output, @P3 output, @P4 output
select @P1, @P2, @P3, @P4

и

exec newParticipant 'qwer','qwer','qwer','1900.01.01','qwer','qwer','qwer','qwer','qwer','qwer','qwer'

дают различный результат?

2) почему перенесение бэкапа базы на другой сервер ликвидирует ошибку (или, вернее сказать, непонятность)?

Понимая, что так дистанционно причину определить сложно, буду ковыряться дальше, мучать старших коллег и ждать, может, кто-нибудь из форумчан сталкивался с аналогичной проблемой.

Спасибо, что уделили время.
1 сен 08, 12:58    [6131480]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aleah
Glory
Если ошибки нет, то значит ошибка в логике вашей процедуры


я верил в это ровно того момента, пока не заменил процедуру на

 insert into testTable
select 1 

согласитесь, тяжело поверить, что в этих двух строчках есть "ошибка в логике".

Почему же ? Вы проверяет содержимое таблицы в другом коннекте ?
А вы убедились, что в первом коннекте транзакция заверешена ?
1 сен 08, 13:01    [6131493]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
Oleja
Member

Откуда:
Сообщений: 23
Скажите, а чем закончилось ваша борьба с SQL ?
У меня похожая ситуация произошла, на сервере ничего не делали, а выборка не работает на реальной базе, но если берешь старый бэкап - то там все в порядке. В чем разница я не пониаю.
6 май 09, 18:39    [7154974]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: sp_cursoropen  [new]
Ashron
Member

Откуда:
Сообщений: 4
Oleja
Скажите, а чем закончилось ваша борьба с SQL ?
У меня похожая ситуация произошла, на сервере ничего не делали, а выборка не работает на реальной базе, но если берешь старый бэкап - то там все в порядке. В чем разница я не пониаю.


Аналогичная ситуация всплыла. В чем дело?
23 сен 11, 11:50    [11324572]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
step_ks
Member

Откуда:
Сообщений: 936
Покажите ситуацию.
23 сен 11, 12:36    [11325027]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen  [new]
utmax
Member

Откуда: Коломна
Сообщений: 148
Может быть не стоит использовать sp_cursoropen, а посмотреть, например, в сторону sp_executesql
23 сен 11, 14:17    [11326284]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить