У меня есть клиентская программа на c #, которая выполняет хранимые процедуры через ExectueNonQuery
, включая PRINT
перехват и вывод ошибок с событиями InfoMessage. Работает нормально, но я заметил кое-что странное.
Когда я выполняю хранимую процедуру из SSMS, она отображает количество строк для каждого отдельного оператора SQL, который выполняется на вкладке «Сообщения» (как будто он поступает из InfoMessages). Тем не менее, моя программа никогда не видит эти сообщения, хотя она получает все те же другие выходные данные. Вместо этого он просто возвращает строки, затронутые в результате выполнения функции ExecuteNonQuery, который представляет собой сумму всех отдельных рядов (что является бесполезным).
Например, эта процедура:
use [tempdb]
go
SELECT *
INTO MyCols
FROM sys.columns
go
CREATE PROC foo As
UPDATE MyCols
SET name = name + N''
-- SSMS shows (662 row(s) affected)
UPDATE MyCols
SET name = name + N''
WHERE name like '%x%'
-- SSMS shows (59 row(s) affected)
PRINT 'bar'
-- both SSMS and ExecuteNonQuery get this
-- ExecuteNonQuery returns 721 rows affected
GO
Когда процедура foo
запущена, SSMS отображает количество строк 662 и 59, но ExecuteNonQuery
возвращает только 721.
Итак, как я могу получить ту же информацию, что и SSMS?
Просто чтобы прояснить это: меня не интересует, как изменить хранимые процедуры для добавления PRINT @@ROWCOUNT
s после каждого оператора SQL. Я знаю, как это сделать, и это не вариант в большинстве случаев по разным причинам.
Я спрашиваю, как сделать то, что SSMS делает здесь. Я могу изменить код клиента все, что я хочу на данный момент (на данный момент, во всяком случае), и я хотел бы сделать это правильно.
источник
PRINT
иRAISERROR(..., 10, 1)
приходят после результирующих наборов. Я пытаюсь найти порядок сообщений в этой документации, но до сих пор не сталкивался с ним.Результат выполнения запроса просто не будет делать то, что вы хотите здесь. Но вы все равно можете туда добраться, все зависит от того, для чего вы хотите использовать информацию.
Вы можете добавить эту строку после каждой вставки «PRINT @@ ROWCOUNT», и вы должны получить количество строк, затронутых предыдущей операцией, как часть вывода (где вы получаете «bar»).
В качестве альтернативы, вы можете добавить параметр «OUTPUT» в вашу хранимую процедуру, чтобы сохранить результаты, а затем просто перехватить их при запуске executetenonquery.
РЕДАКТИРОВАТЬ:
Мне удалось изменить пример, который Джонатан Кехасиас собрал, чтобы включить обработку событий оператора. Просто добавьте эти две строки.
источник