Я вызываю одну хранимую процедуру (2) из другой хранимой процедуры (1). Обе хранимые процедуры возвращают набор данных в виде оператора SELECT
в конце. Мне нужно захватить оба из них в моем коде c #, однако, мой код только захватывает набор данных Select
хранимой процедуры (2). Пожалуйста, руководство, как я могу сделать это?
Вот формат процедур:
CREATE PROCEDURE dbo.GoalStop
@ID INT,
@StopDate [DATETIME] = NULL
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Return varchar(500);
BEGIN TRY
UPDATE dbo.Table2
SET StopDate = @StopDate
WHERE TableID = @ID
SET @Return = 'The Goal was successfully stopped.';
SELECT 'DATABASE MESSAGE: ' + @Return
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT
SELECT
@ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
END
И хранимая процедура вызова:
CREATE PROCEDURE [dbo].[Goal_Restart]
@ID [INT],
@Goal [DECIMAL](18, 8) = NULL,
@StartDate [DATETIME] = NULL,
@StopDate [DATETIME] = NULL,
@Updatedby [VARCHAR](8),
@UpdateDate [DATETIME] = NULL
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Return varchar(500)
BEGIN TRY
SELECT @Name = Name
FROM [dbo].Table1
WHERE ID = @ID
--bunch of IF ELSE Statements...
BEGIN
EXEC dbo.GoalStop @ID, @StopDate --Call to other stored procedure
INSERT INTO [dbo].Table1([Name], [Goal], [StartDate], [StopDate], [Updatedby], [UpdateDate])
VALUES (@Name, @Goal, @StartDate, @StopDate, @Updatedby, @UpdateDate)
SET @Return = 'The Goal was successfully created.';
END
END
SELECT 'DATABASE MESSAGE: ' + @Return
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT
SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
END
и код C #, вызывающий эту процедуру:
string returnString = string.Empty;
SqlDataReader reader;
try
{
using (SqlConnection connection = Connection.GetSqlConnection())
{
using (SqlCommand command = new SqlCommand("dbo.Goal_Restart", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = 90;
command.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
command.Parameters.Add("@Goal", SqlDbType.Decimal).Value = goal;
command.Parameters.Add("@Updatedby", SqlDbType.Char, 7).Value = Updatedby;
command.Parameters.Add("@UpdateDate", SqlDbType.DateTime).Value = updateDate;
if (startDate != null)
{
command.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
}
if (stopDate != null && (Convert.ToDateTime(stopDate)).ToShortDateString() != "1/1/1900")
{
command.Parameters.Add("@StopDate", SqlDbType.DateTime).Value = stopDate;
}
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
command.Prepare();
reader = command.ExecuteReader();
while (reader.Read())
{
returnString = reader[0].ToString();
}
}
}
}
Если я выполняю exec в анализаторе запросов, вывод - результат двух разностных запросов (см. Прикрепленное изображение)
DATABASE MESSAGE: The Goal was successfully Stopped.
DATABASE MESSAGE: The Goal was successfully created.
Однако returnString
в C # захватывает только сообщения от вложенной процедуры и не вызывает процедуру.
DATABASE MESSAGE: The Goal was successfully Stopped.
Как мне захватить обе или только вызывающую процедуру?