Когда я пытаюсь выполнить сохраненный процесс, из другого хранимого процесса, из среднего уровня - ничего не происходит - PullRequest
0 голосов
/ 01 февраля 2010

У нас есть возможность выполнять хранимые проки со среднего уровня. По сути, в таблице базы данных с именем «SQLJobStep» у нас есть - среди прочего - столбец varchar (300) с именем «StoredProcedure», который содержит что-то вроде этого:

usp_SendReminderEmails @Debug=0, @LoginID

Через промежуточный уровень пользователь нажимает на ссылку, чтобы запустить процедуру по своему выбору. В серверной части происходит то, что proc («usp_SQLJobsActionGet») ищет правильное значение в столбце «SQLJobStep.StoredProcedure» и выполняет указанное выше значение.

Это часть кода из "usp_SQLJobsActionGet", которая выполняет указанное выше значение:

DECLARE @StepId int
DECLARE @LoginID varchar(12)
DECLARE @StoredProcedure varchar(300)

SET @StepId = 74
SET @LoginID = 'Yoav'

SELECT @StoredProcedure = SJS.StoredProcedure 
FROM SQLJobStep AS SJS
WHERE SJS.StepId = @StepId

SET @StoredProcedure = ISNULL(@StoredProcedure, '')

IF CHARINDEX('@LoginID', @StoredProcedure) > 0
BEGIN
    SET @LoginID = ISNULL(@LoginID, 'UNKNOWN')
    SET @StoredProcedure = REPLACE(@StoredProcedure, '@LoginID', '@LoginID = ''' + @LoginID + '''')
END

IF @StoredProcedure != ''
BEGIN
    EXEC(@StoredProcedure)
END    

Довольно простые вещи ....

Приведенный выше код преобразует исходное значение в (и затем выполняет):

usp_SendReminderEmails @Debug=0, @LoginID = 'Yoav'

Вот вопрос:

При выполнении значения "usp_SendReminderEmails @ Debug = 0, @LoginID = 'Yoav'" ничего не происходит. Ошибка не возвращается на средний уровень. Но я знаю, что значение извлекается из таблицы SQLJobStep, потому что у нас есть другие значения хранимых процедур, которые извлекаются и работают нормально. (Обратите внимание, что другие значения имеют только параметр @LoginID, в то время как он также имеет @ Debug = 0.)

В то же время, если я запускаю приведенный выше код (как потрошенный код, так и напрямую вызывающий «usp_SQLJobsActionGet») в SQL Management Studio, он отлично работает.

У вас есть какой-нибудь совет? Я уверен, что мне не хватает чего-то очень простого.

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Мой совет? Используйте sp_ExecuteSQL вместо конкатенации / замены:

IF @StoredProcedure != ''
BEGIN
    EXEC sp_ExecuteSQL @StoredProcedure, N'@LoginID varchar(12)', @LoginID
END

В целом, хотя - EXEC должно работать; Вы уверены , что @StoredProcedure не пусто?

0 голосов
/ 02 февраля 2010

Спасибо за помощь. Я нашел ответ на свою проблему, и, как вы можете догадаться, это было связано с проблемами, которые я описал изначально:

В процедуре usp_SendReminderEmails мы вызываем другую процедуру для проверки каждой отправленной записи электронной почты. Этот процесс аудита вставляет запись в таблицу аудита и затем возвращает идентификатор (SELECT TOP 1 SCOPE_IDENTITY ()). Хотя он возвращает только 1 запись за раз, он вызывается курсором (в usp_SendReminderEmails) для отправки каждого письма за раз (примечание: это процедура SQL Job).

Что я заметил, так это то, что при выполнении usp_SendReminderEmails @ Debug = 0, @LoginID = 'Yoav' в Management Studio все работает нормально, но возвращается предупреждение (!):

В запросе превышено максимальное количество наборов результатов, которые могут отображаться в таблице результатов. В сетке отображаются только первые 100 наборов результатов.

Поэтому при вызове proc из промежуточного уровня ничего не происходило - не возвращалось ни одной ошибки, но не обрабатывалось и usp_SendReminderEmails. Я исправил это, вызвав процедуру аудита во вставке во временную таблицу в usp_SendReminderEmails, тем самым гарантировав, что он не будет возвращен (поскольку это всего лишь значение идентификатора):

INSERT INTO #AuditData (AuditDataId)
EXEC usp_AuditSave
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...