- без запроса обычно вызывается с
SqlCommand.ExecuteNonQuery()
. Но это действительно так, чтобы запустить его как SqlCommand.ExecuteReader()
. Единственное отличие состоит в том, что первый вызов DataReader.Read()
возвращает false
для хранимой процедуры, которая не возвращает набор результатов.
- A набор строк выполнен как
SqlCommand.ExecuteReader()
. Первый звонок DataReader.Read()
вернет true
.
- A скаляр - это просто ярлык для набора строк с одним столбцом и одной строкой.
Таким образом, вы можете использовать ExecuteReader
во всех трех сценариях.
Хотя для вашего вопроса кажется ненужным, вы можете получить метаданные для набора результатов, используя опцию fmtonly. Этот параметр заставляет оператор возвращать только данные столбца; никакие строки данных не возвращаются. Таким образом, вы можете запустить:
SET FMTONLY ON;
EXEC dbo.YourProc @par1 = 1;
SET FMTONLY OFF;
Выполнение это как CommandText
из C#, вы можете проверить имена столбцов хранимая процедура будет возвращать.
Чтобы убедиться, что хранимая процедура запуска, таким образом, не производит каких-либо побочных эффектов, я побежал следующий тестовый пример:
create table table1 (id int)
go
create procedure YourProc(@par1 int)
as
insert into table1 (id) values (@par1)
go
SET FMTONLY ON;
EXEC dbo.YourProc @par1 = 1;
SET FMTONLY OFF;
go
select * from table1
Это не возвращает ни одной строки. Таким образом, параметр только для формата гарантирует, что фактические обновления или вставки не возникнут.