2013-05-10 5 views
-1

Доброе утро. Я ОЧЕНЬ новичок в SQL и проблема с хранимыми процедурами. Во-первых, я использую SQL 2008, я не знаю, имеет ли это значение. Итак, вот моя проблема. Я называю хранимая процедура, 2 раза подряд с различными значениями передается в. (Кстати, я только добавил with recompile часть. Это не поможет)Сохраненная процедура - получение ошибки при втором вызове

EXECUTE crstored.sp_hhcAllActivityInstreamLoop 
      @measureVarIDName ='staticPayact6moID' 
      ,@measureSuppVarIDName ='payact6moID' 
      ,@measureDesc ='payact6moDesc' 
      ,@measureSuppTable ='crsupp.payact6mo' 
      WITH RECOMPILE; 
      GO 

EXECUTE crstored.sp_hhcAllActivityInstreamLoop 
      @measureVarIDName ='staticJourneyID' 
      ,@measureSuppVarIDName ='journeyID' 
      ,@measureDesc ='journeyDesc' 
      ,@measureSuppTable ='crsupp.journey' 
      WITH RECOMPILE; 
      GO 

В первый раз я называть его, он будет запустить. Второй раз, когда я получаю следующее:

Msg 207, Level 16, State 1, Line 20 Недопустимое имя столбца 'staticJourneyID'. Msg 207, уровень 16, состояние 1, строка 20 Недопустимый столбец имя 'staticJourneyID'.

Чтобы исправить это, я удаляю хранимую процедуру. Перекомпилируйте его на полпути, поэтому он ничего не делает, кроме как вводит параметры и делает простой выбор с одним из параметров. Запустить его. Удалите хранимую процедуру. Перекомпилируйте полную процедуру. Затем я могу запустить его для второго вызова. Однако теперь он настроен только на запуск JourneyID, и если мне нужно вернуться и вызвать его для переменных payAct6mos, я должен выполнить один и тот же сценарий удаления, перекомпиляции и запуска. У кого-нибудь есть предложения? Единственное, о чем я могу думать сейчас, это иметь две копии одного и того же кода с разными именами. Мне было бы неловко поддерживать это.

Кроме того, я не знаю, если это имеет значение, но из-за того, как я использую параметры, мне сказали, чтобы вложить свой код в хранимых процедурах с:

select @[email protected]+'  type line of code here  ' 

Спасибо!


Просто последующий вопрос по моей проблеме. Я понял. Как я уже сказал, я просто новичок в SQL. Итак, получается, что таблицы, которые я отбрасывал, я отбрасывал с помощью динамического SQL в SP. Как только я сбросил их с помощью «обычного» SQL, вызовы прекратились. Я не знаю, почему это так, но там у вас это есть. Спасибо за помощь каждого.

+0

показать нам код хранимой процедуры. – RBarryYoung

+0

Итак, я не могу опубликовать SP, потому что слишком много символов. – user2370154

ответ

4

Это спекуляция. Я полагаю, что вторая часть хранимой процедуры использует динамический SQL. Он создает инструкцию SQL, используя имя в @measureVarIDName.

Столбец staticPayact6moID существует в таблице, на которую он смотрит.

Столбец staticJourneyID не существует в таблице.

Другими словами, вам необходимо исправить первый аргумент (по крайней мере) во втором вызове.

+0

Вы абсолютно правы. Я использую динамический SQL, и я использую параметры для создания некоторого кода. Означает ли это, что он хранит что-то в кеше, поскольку, как только я перекомпиляции SP, я могу запустить вызов SP с staticJourneyID без каких-либо проблем. – user2370154

+0

@ пользователь2370154. , , Нет. По моему опыту, аргументы хранимой процедуры работают очень хорошо. Вам нужно будет опубликовать код для хранимой процедуры для получения дополнительных указаний. Еще одна вещь. , , Включите имя базы данных в вызове хранимой процедуры, чтобы быть уверенным, что каждый раз вызывается один и тот же код. –

Смежные вопросы