Я уверен, что strtok возвращает указатель, который ссылается на тот первый аргумент, который, в вашем случае, является выделением стека. Я верю, что возвращение массива указателей на это выделение стека приведет к неопределенному поведению. Это может или не может быть причиной вашей проблемы. Это трудно понять, не видя больше кода. Чтобы протестировать, попробуйте изменить эту часть своего кода следующим образом:
void parse_cmd(char *retval[], char *cmd){
char *tmp;
char *a = strdup(cmd);
int i = 0;
Прежде чем использовать его в производстве, вам нужно найти какой-то способ, чтобы убедиться, что вы освободили «a», иначе вы получите утечку. , Может быть, вы могли бы просто вернуть его вместо void и освободить его из другого места, или вы могли бы на самом деле strdup () каждый токен и написать функцию, чтобы освободить их всех или все, что работает для вас.
Если есть другие проблемы, они могут быть в другом коде. Я действительно не вижу здесь ничего плохого.
SET SHOWPLAN_ALL ON
GO
-- FMTONLY will not exec stored proc
SET FMTONLY ON
GO
exec yourproc
GO
SET FMTONLY OFF
GO
SET SHOWPLAN_ALL OFF
GO
При выполнении хранимой процедуры в SQL Management Studio 2008 вы можете щелкнуть Запрос -> Включить фактический план выполнения из меню ... его также на панели инструментов
После прочтения комментариев кажется, что выполнение является проблемой, и для ее решения я бы рекомендовал обернуть выполнение хранимой процедуры в транзакцию, откатывая ее в конце
Использовать
SET SHOWPLAN_ALL ON
Go
exec myStoredProc 234
GO
SET SHOWPLAN_ALL OFF
GO
См. http://msdn.microsoft.com/en-us/library/aa259203.aspx Пока вы не используете таблицы tmp, я думаю, что это будет работать
Запуск хранимой процедуры в Management Studio (или анализаторе запросов) с включенным показом фактического плана выполнения (из меню запросов) покажет вам план для хранимой процедуры после ее запуска. Если вы не можете запустить его, покажите примерный план выполнения (хотя по моему опыту это часто менее точно.)
Вы также можете использовать Profiler для просмотра плана выполнения. Вы захотите включить параметр «Производительность: Показать профиль статистики плана» и обязательно включите двоичные данные в свои столбцы.
Затем можно выполнить любой запрос или процедуру и просмотреть план выполнения.
Изменить
Если Вы не можете использовать профилировщик и не хотите открывать другое окно. Я предлагаю включить блок комментариев в начале ваших сохраненных процедур. Например, представьте следующее:
/*
Description: This procedure does XYZ etc...
DevelopedBy: Josh
Created On: 4/27/09
Execution: exec my_procName N'sampleparam', N'sampleparam'
*/
ALTER PROCEDURE my_procName
@p1 nvarchar(20),
@p2 nvarchar(20)
AS
Это позволяет вам выделять только цель выполнения и включать показывать план выполнения. И запустить его.