У меня есть клиентская программа на 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 делает здесь. Я могу изменить код клиента все, что я хочу на данный момент (на данный момент, во всяком случае), и я хотел бы сделать это правильно.