C # и SQL Server: получить результат из хранимой процедуры

У меня есть следующая хранимая процедура, которая вычисляет максимальные значения для нескольких столбцов. Я достиг такого же результата, используя длинный союзный выбор, однако меня просто интересует разница в производительности. Используя SQL-параметр направления C # для любого выходного или возвращаемого значения, я хотел бы только вернуть значение выражения select, помеченного как «NEED TO GET THAN VALUE RETURNED».

Я попытался создать переменную OUTPUT, а затем использовать синтаксис SET для сохранения значения, затем синтаксис RETURN. Но безрезультатно. Умеет получать ошибки, которые мне нужны для создания переменных, которые уже есть. Я не понимаю области видимости переменных. (Я удалил это из кода тем временем)

Вот мой SP:

CREATE PROCEDURE sp_GetMaximumMax @FromDate DateTime, @ToDate DateTime, @TableName VarChar(150) AS DECLARE @SQL NVARCHAR(512), @ColumnName VARCHAR(150) DECLARE @Result TABLE (Result int) DECLARE read_cursor CURSOR FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName AND (column_name != 'id' AND column_name !='time' AND column_name !='no') OPEN read_cursor; FETCH NEXT FROM read_cursor INTO @ColumnName; SET @SQL = 'SELECT MAX(['[email protected]+']) FROM '[email protected]+' WHERE [time] BETWEEN '''+CONVERT(VARCHAR, @FromDate, 120)+''' AND '''+CONVERT(VARCHAR, @ToDate, 120)+''''; WHILE @@FETCH_STATUS = 0 BEGIN Print @SQL INSERT @Result EXEC(@SQL); FETCH NEXT FROM read_cursor END -- NEED TO GET THIS VALUE RETURNED SELECT MAX(Result) AS MaxVar from @Result CLOSE read_cursor; DEALLOCATE read_cursor; 

При этом мой пересмотренный код:

 CREATE PROCEDURE sp_GetMaximumAvg @FromDate DateTime, @ToDate DateTime, @TableName VarChar(150) AS CREATE TABLE #Fields(FieldName VARCHAR(150)) -- store column names CREATE TABLE #Data(FieldName DECIMAL) -- store max values DECLARE @ColumnName VARCHAR(150) DECLARE @SQL VARCHAR(512) -- add fields into field table INSERT INTO #Fields (FieldName) SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName AND (column_name != 'id' AND column_name !='time' AND column_name !='no') DECLARE @Field VARCHAR(150) DECLARE @MyOutput INT DECLARE ReadDaRow CURSOR FOR SELECT * FROM #Fields OPEN ReadDaRow FETCH ReadDaRow INTO @Field WHILE(@@FETCH_STATUS=0) BEGIN SET @SQL = 'SELECT AVG(['[email protected]+']) FROM '[email protected]+' WHERE [time] BETWEEN '''+CONVERT(VARCHAR, @FromDate, 120)+''' AND '''+CONVERT(VARCHAR, @ToDate, 120)+''''; PRINT @SQL INSERT INTO #Data EXEC(@SQL) FETCH ReadDaRow INTO @Field END SELECT @MyOutput = MAX(FieldName) FROM #Data RETURN @MyOutput CLOSE ReadDaRow DEALLOCATE ReadDaRow DROP TABLE #Fields DROP TABLE #Data 

c # пример выполнения SP:

 SqlCommand GetMaxCmd = new SqlCommand("sp_GetMaximumAvg", SQLConnection); GetMaxCmd.CommandType = System.Data.CommandType.StoredProcedure; GetMaxCmd.Parameters.Add("@FromDate", SqlDbType.DateTime).Value = DateTime.Parse(from_date); GetMaxCmd.Parameters.Add("@ToDate", SqlDbType.DateTime).Value = DateTime.Parse(to_date); GetMaxCmd.Parameters.Add("@TableName", SqlDbType.VarChar).Value = table_name; SqlParameter Output = GetMaxCmd.Parameters.Add("@MyOutput", SqlDbType.SmallInt); Output.Direction = ParameterDirection.ReturnValue; try { GetMaxCmd.ExecuteNonQuery(); Max = Convert.ToInt32(Output.Value); } catch (NullReferenceException) { } catch (FormatException) { } catch (SqlException) { } 

Вы можете вызвать NextResult() в DataReader для получения набора результатов последовательных выборок.

EDIT: вы можете return его вместо набора строк:

 CLOSE read_cursor; DEALLOCATE read_cursor; RETURN (SELECT MAX(Result) AS MaxVar from @Result) 

Это будет в параметре с направлением System.Data.ParameterDirection.ReturnValue .

Или вы можете прочитать его с помощью SqlCommand.ExecuteScalar() .

Interesting Posts

Запрос Sql для трех таблиц проверяет любую из таблиц

Группировать по каждой N записи в T-SQL

Избегать разветвления в хранимых процедурах, возвращающих результаты поиска?

Известная проблема: хранимая процедура SQL Server 2005 не завершена параметром

SQL Server FREETEXTTABLE не возвращает результат

Какой из двух способов кодирования внутреннего соединения быстрее?

Подсчитайте количество входящих подстрок в столбце

SQL Server 2008 R2: объединить два запроса для оптимизации

SQL, проверьте, находятся ли строки в другой таблице

Наверху 1 быстрее, если выбрать только одну строку

Транспонирование строк в столбцы на основе столбца ID

Внешний ключ показывает значение null при вставке в таблицу Child, ошибка Невозможно вставить значение NULL в столбец

Sql server LIKE Оператор с разделенной запятой строкой

Параметрированный запрос, который не был предоставлен

SqlDataAdapter как значение объекта?

Давайте будем гением компьютера.