Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
Добавлю, что последний SELECT не внутри цикла, в цикле ничего не селектится. |
10 апр 14, 13:35 [15861488] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, telepat mode on create procedure ... AS SET NOCOUNT ON; .... telepat mode off |
10 апр 14, 13:39 [15861538] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||
10 апр 14, 13:39 [15861539] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
да, эта строка есть, я ее сразу использовал |
||
10 апр 14, 13:42 [15861567] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||
10 апр 14, 13:50 [15861670] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, когда дойдете до этапа размещения кода процедуры незабудьте про тэг SRC |
10 апр 14, 13:51 [15861682] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Проверьте триггеры на таблице tblSecurityMessageOption. |
10 апр 14, 14:08 [15861860] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, Дополнительно, безотносительно к проблеме, чисто ИМХО 1) @@Identity заменить на SCOPE_IDENTITY() или OUTPUT 2) переписать без курсоров 3) Execute => sp_executesql |
10 апр 14, 14:20 [15861957] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
ну их там нет, я эту таблицу недавно создал, и триггеров туда точно не добавлял (и никто другой, т.к. БД локальная и на ней я работаю сам). у меня может бить и 1000 и 10000 итераций, не хотелось бы потом в vbscript гонять систему и без того нагруженную по циклу, пока не найду нужный мне Recordset. Пока цикл конечно выход из ситуации, но хотелось бы, что работало правильно. |
||
10 апр 14, 14:25 [15862006] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, Я не понял, а если в студии запустить, сколько наборов выдает? вместо EXECUTE сделайте PRINT и посмотрите запрос |
10 апр 14, 14:28 [15862023] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
В студии как раз возвращается одна таблица по последнему селекту, это я уже проверял |
||
10 апр 14, 14:48 [15862227] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
тогда ищите проблему в вашем "vbscript запрос" |
||
10 апр 14, 15:10 [15862473] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, profiler натравите и посмотрите, что шлет реально на сервер ваш VBS. Проблема на стороне клиента |
10 апр 14, 15:15 [15862525] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
вот строка из 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] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
Если бы я посылал с клиента не правильный запрос, я бы это понял, но хранимая процедура по базе выполняет то, что от нее требуется, только вот возвращает лишнее. |
||
10 апр 14, 16:07 [15863015] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
Так, теперь я на 99% уверен что дело в курсоре, я закомментил инсерты и оставил только последний селект и объявления переменных. Можно как-то очистить все наборы перед последним селектом? |
10 апр 14, 16:37 [15863323] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
там у вас курсор вообще не нужен, можно без него переписать |
10 апр 14, 16:39 [15863333] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
если не сложно, опишите как, суть в том чтобы разделить строку разделителем ',' на массив строк. |
||
10 апр 14, 16:43 [15863365] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Sanprof Member Откуда: Харьков, Украина Сообщений: 259 |
может быть попробовать использовать вместо курсора SUBSTRING? |
10 апр 14, 16:46 [15863410] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Sanprof, Не могу понять у вас действительно проблема или Вы стебётесь не могу поверить, что по содержимому "лишних" наборов Вы до сих пор не поняли откуда они взялиcь PS. Прежде чем что-то ломать, найдите причину, а потом начинайте бороться PPS. навсякий случай спрошу select @@version мало ли |
10 апр 14, 17:26 [15863765] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |