Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Здравствуйте, собственно есть у меня хранимая процедура, в ней есть цикл по курсору, в котором только инсертятся определенные значения в определенную таблицу, и в конце SELECT к другой таблице. В vbscript я вызываю эту хранимую процедуру и мне возвращается столько Recordset-ов, сколько было итераций в цикле (проверено при разном количестве итераций) плюс 1 (тот SELECT в конце), как раз мне то он и нужен, но мне приходится извращаться в коде, чтобы получить нужный мне Recordset, вот как-то так
Do While rsSendEmails.State = adStateClosed
    Set rsSendEmails = rsSendEmails.NextRecordset
Loop

Что мне нужно сделать в хранимой процедуре, чтобы возвращался только тот последний SELECT?
10 апр 14, 13:33    [15861471]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Добавлю, что последний SELECT не внутри цикла, в цикле ничего не селектится.
10 апр 14, 13:35    [15861488]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,

telepat mode on
create procedure ...
AS
SET NOCOUNT ON;
....

telepat mode off
10 апр 14, 13:39    [15861538]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Sanprof
Что мне нужно сделать в хранимой процедуре, чтобы возвращался только тот последний SELECT?
Для начала написать set nocount on в процедуре.
10 апр 14, 13:39    [15861539]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
iiyama
Sanprof,

telepat mode on
create procedure ...
AS
SET NOCOUNT ON;
....


telepat mode off

да, эта строка есть, я ее сразу использовал
10 апр 14, 13:42    [15861567]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Sanprof
да, эта строка есть, я ее сразу использовал
Тогда может быть вы и остальные строки процедуры покажете?
10 апр 14, 13:50    [15861670]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,
когда дойдете до этапа размещения кода процедуры незабудьте про тэг SRC
10 апр 14, 13:51    [15861682]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Гавриленко Сергей Алексеевич
Sanprof
да, эта строка есть, я ее сразу использовал
Тогда может быть вы и остальные строки процедуры покажете?


CREATE  PROCEDURE [dbo].[spx_Insert_tblSecurityMessage]
	@Subject nvarchar(250),
	@Message  nvarchar(max),
	@SecurityMessageTypeID int = 0,
	@SecurityMessageTypeValue varchar(2000) = NULL
AS
BEGIN

	SET NOCOUNT ON
	SET ANSI_WARNINGS OFF	
	
	DECLARE @SQLCommand varchar(2000)	
	DECLARE @SMID int
	DECLARE cur CURSOR FOR SELECT Value FROM dbo.fn_Split(@SecurityMessageTypeValue, ',')
	DECLARE @SingleValue varchar(50)
	DECLARE @SMParam varchar(2000)
	
	SET @SMParam = ''
	
	OPEN cur
	INSERT INTO [dbo].[tblSecurityMessage] (
		[Subject],
		[Message])
	VALUES (
		@Subject,
		@Message)
	SET @SMID = @@IDENTITY

	FETCH NEXT FROM cur INTO @SingleValue
	WHILE @@FETCH_STATUS = 0
	BEGIN
		INSERT INTO [tblSecurityMessageOption] (
			[SecurityMessageID],
			[SecurityMessageTypeID],
			[SecurityMessageTypeValue])
		VALUES (
			@SMID,
			@SecurityMessageTypeID,
			@SingleValue)
		IF @SingleValue IS NOT NULL
			SET @SMParam = @SMParam + '''' + @SingleValue + ''','
		FETCH NEXT FROM cur INTO @SingleValue
	END
	CLOSE cur
	DEALLOCATE cur
	
	IF @SMParam IS NOT NULL AND @SMParam <> ''
		IF SUBSTRING(@SMParam, LEN(@SMParam), 1) = ','
			SET @SMParam = LEFT(@SMParam, LEN(@SMParam) - 1)	
	
	SET @SQLCommand = 'SELECT * tblMessage WHERE Value = ''' + @SMParam + ''''
					
	execute (@SQLCommand)
	SET NOCOUNT OFF
END
GO
10 апр 14, 13:55    [15861723]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Проверьте триггеры на таблице tblSecurityMessageOption.
10 апр 14, 14:08    [15861860]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,
Дополнительно, безотносительно к проблеме, чисто ИМХО
1) @@Identity заменить на SCOPE_IDENTITY() или OUTPUT
2) переписать без курсоров
3) Execute => sp_executesql
10 апр 14, 14:20    [15861957]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Владислав Колосов
Проверьте триггеры на таблице tblSecurityMessageOption.

ну их там нет, я эту таблицу недавно создал, и триггеров туда точно не добавлял (и никто другой, т.к. БД локальная и на ней я работаю сам).

у меня может бить и 1000 и 10000 итераций, не хотелось бы потом в vbscript гонять систему и без того нагруженную по циклу, пока не найду нужный мне Recordset. Пока цикл конечно выход из ситуации, но хотелось бы, что работало правильно.
10 апр 14, 14:25    [15862006]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,
Я не понял, а если в студии запустить, сколько наборов выдает?
вместо EXECUTE сделайте PRINT и посмотрите запрос
10 апр 14, 14:28    [15862023]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
iiyama
Sanprof,
Я не понял, а если в студии запустить, сколько наборов выдает?
вместо EXECUTE сделайте PRINT и посмотрите запрос

В студии как раз возвращается одна таблица по последнему селекту, это я уже проверял
10 апр 14, 14:48    [15862227]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
EXEC	[dbo].[spx_Insert_tblSecurityMessage]
		@Subject = N'Test',
		@Message = N'Test',
		@SecurityMessageTypeID = 1,
		@SecurityMessageTypeValue = N'830830,930930'

Вот это в студии показывает одну таблицу, зато в vbscript запрос с такими же параметрами 3 итерации в цикле, вобщем последний рекордсет тот, что мне нужно.
10 апр 14, 14:52    [15862285]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Sanprof
Вот это в студии показывает одну таблицу, зато в vbscript запрос с такими же параметрами 3 итерации в цикле, вобщем последний рекордсет тот, что мне нужно.


тогда ищите проблему в вашем "vbscript запрос"
10 апр 14, 15:10    [15862473]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,
profiler натравите и посмотрите, что шлет реально на сервер ваш VBS. Проблема на стороне клиента
10 апр 14, 15:15    [15862525]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
iiyama
Sanprof,
profiler натравите и посмотрите, что шлет реально на сервер ваш VBS. Проблема на стороне клиента

вот строка из Profiler
<event EventClass="12" CPU="1094" Reads="38287" Writes="21" Duration="15720703" SPID="52" LoginName="sa" DatabaseName="Test" ObjectName="" ApplicationName="Internet Information Services">exec spx_Insert_tblSecurityMessage 'Test', 'Test', 1, '811439, 763161, 763162, 763163, 829073, 849735, 849736'</event>


в данном случае я получаю 8 наборов
10 апр 14, 16:04    [15862970]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
iiyama
Проблема на стороне клиента

Если бы я посылал с клиента не правильный запрос, я бы это понял, но хранимая процедура по базе выполняет то, что от нее требуется, только вот возвращает лишнее.
10 апр 14, 16:07    [15863015]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Так, теперь я на 99% уверен что дело в курсоре, я закомментил инсерты и оставил только последний селект и объявления переменных. Можно как-то очистить все наборы перед последним селектом?
10 апр 14, 16:37    [15863323]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Konst_One
Member

Откуда:
Сообщений: 11680
там у вас курсор вообще не нужен, можно без него переписать
10 апр 14, 16:39    [15863333]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
Konst_One
там у вас курсор вообще не нужен, можно без него переписать

если не сложно, опишите как, суть в том чтобы разделить строку разделителем ',' на массив строк.
10 апр 14, 16:43    [15863365]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
у меня в базе, до меня, была написана функция
CREATE   FUNCTION [dbo].[fn_Split](@sText varchar(8000), @sDelim varchar(20) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000))
AS
BEGIN
--...........................

она меня полностью устраивала, до этого момента
10 апр 14, 16:45    [15863382]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
может быть попробовать использовать вместо курсора SUBSTRING?
10 апр 14, 16:46    [15863410]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
Sanprof
Member

Откуда: Харьков, Украина
Сообщений: 259
вот быстренько набросал алгоритм, это меня вполне устраивает
	DECLARE @SecurityMessageTypeValue varchar(2000)
	DECLARE @SingleValue varchar(50)
	
	SET @SecurityMessageTypeValue = '5623, 258596, 55533, 55552'
	
	WHILE CHARINDEX(',', @SecurityMessageTypeValue) > 0
	BEGIN
		SET @SingleValue = SUBSTRING(@SecurityMessageTypeValue, 0, CHARINDEX(',', @SecurityMessageTypeValue))
		PRINT LTRIM(RTRIM(@SingleValue))
		SET @SecurityMessageTypeValue = SUBSTRING(@SecurityMessageTypeValue, CHARINDEX(',', @SecurityMessageTypeValue)+1, LEN(@SecurityMessageTypeValue) - CHARINDEX(',', @SecurityMessageTypeValue))
	END
	IF @SecurityMessageTypeValue <> ''
		PRINT LTRIM(RTRIM(@SecurityMessageTypeValue))

результат
5623
258596
55533
55552

щас попробую в процедурке применить
10 апр 14, 16:57    [15863545]     Ответить | Цитировать Сообщить модератору
 Re: Xранимая процедура возвращает несколько Recordset  [new]
iiyama
Member

Откуда:
Сообщений: 642
Sanprof,
Не могу понять у вас действительно проблема или Вы стебётесь
не могу поверить, что по содержимому "лишних" наборов Вы до сих пор не поняли откуда они взялиcь

PS. Прежде чем что-то ломать, найдите причину, а потом начинайте бороться
PPS. навсякий случай спрошу select @@version мало ли
10 апр 14, 17:26    [15863765]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить