2017-01-29 3 views
-1

Я пытаюсь создать хранимую процедуру, которая, кажется, возвращает сетку. Но мне нужен только первый столбец этой сетки. Ниже приведен код, я использую, чтобы вызвать процедуруХранимая процедура возвращает несколько значений, но нужна только одна

USE [OperationsView] 

DECLARE @ProductionDate As DateTime 
DECLARE @tag_in As VARCHAR(80) 
DECLARE @FCChemGALPERMIN float 
DECLARE @pi_server As VARCHAR(32) 
DECLARE @endDate As DateTime 
DECLARE @Debug As Bit 
DECLARE @result As Float 

SELECT @ProductionDate = '2016-12-01 07:00:00' 
SELECT @tag_in = 'I-FC-835' 
SELECT @pi_server = 'valpi' 
SELECT @endDate = DATEADD(DAY, 1, @productionDate) 
SELECT @Debug = 1 

EXEC @FCChemGALPERMIN = Interface.proc_GetPIValueAverageTime 
      @result, @tag_in, @ProductionDate, @endDate, @pi_server, @Debug 
PRINT @FCChemGALPERMIN 
PRINT 'done' 

На вкладке результатов мне нужно это значение с плавающей точкой, я не забочусь о проценте рядом с ним. Ниже этого изображения я получаю на вкладке сообщений. В принципе, я хочу захватить это значение float и присвоить его переменной, чтобы я мог отображать ее и на вкладке сообщений.

вкладка Результаты выглядит следующим образом: Results

вкладка Сообщения выглядит следующим образом: message tab

ChemGALPERMIN показывает 0, когда я просто распечатать эту переменную. Что мне делать, чтобы получить желаемый номер плавающей запятой?

+2

Почему вы и ваш код не игнорируете вторую колонку? В вашем приложении нет ** **, чтобы отображать все, что он получает. Если вы говорите только о SSMS, ??? –

+0

мой код, и я пробовал это, но havent повезло – Gio

+0

@Gio. Я думаю, что ваша проблема не в количестве возвращенных столбцов, а в ПУТЕМ вы возвращаете результат из sproc. См. Мой ответ ниже. – andrews

ответ

0

Учитывая, что есть необходимость во втором столбце, где-то еще.

Вставьте результат в временную таблицу и принять значение с плавающей точкой оттуда

Insert into #temp(float_col,percent_col) 
EXEC Interface.Proc_getpivalueaveragetime 
    @result, 
    @tag_in, 
    @ProductionDate, 
    @endDate, 
    @pi_server, 
    @Debug 

select @FCChemGALPERMIN= float_col 
From #temp 

Если второй столбец не является полезным в любом случае затем изменить свою процедуру с в результате процента столбца

+0

Мне не нужна вторая колонка. я просто не могу получить первое значение float в переменной – Gio

+0

Я отредактировал мое сообщение, чтобы лучше описать проблему – Gio

1

Если Interface.Proc_getpivalueaveragetime является хранимую процедуру и НЕ определенную пользователем функцию, то вы НЕ МОЖЕТЕ вернуть значение из хранимой процедуры, такой как.

UPDATE:, если вы уверены, что ваша хранимая процедура будет всегда возвращать только 1 значение с плавающей точкой и хранимые процедуры не обновлять данные физические таблицы, то вы можете преобразовать его в определенной пользователем функции (CREATE FUNCTION примеры), то вы сможете использовать его так, как у вас есть в своем исходном сообщении, то есть @result = Interface.Proc_GetPIvalueAverageTime (...).

Но если вы все еще хотите сохранить его в качестве вызова хранимой процедуры, вам необходимо передать дополнительный параметр Interface.Proc_GetPIValueAverageTime и пометить его как ВЫХОД. Затем в теле вашей хранимой процедуры, вероятно, в конце ее, когда у вас уже есть необходимое значение float, вам нужно установить этот дополнительный параметр OUTPUT для вычисленного значения float.

Так, в коде будет выглядеть примерно так (вам нужно обновить сохраненную определение процедуры):

CREATE PROCEDURE Interface.proc_GetPIValueAverageTime 
      @result float, 
      @tag_in varchar(80), 
      @ProductionDate DATETIME, 
      @endDate DATETIME, 
      @pi_server VARCHAR(32), 
      @Debug bit, 
      -- new param below 
      @sproc_result float OUTPUT 
AS 
BEGIN 
... do your calc .. 
set @sproc_result = @calculation_result_as_float 
END 

Тогда в контексте вызова вам необходимо определить, что дополнительный результат вар (или использовать один вы уже назвали @result) и передать эти дополнительные параметры для вызова хранимой процедуры:

declare @sproc_result float; 

EXEC @FCChemGALPERMIN = Interface.proc_GetPIValueAverageTime 
      @result, @tag_in, @ProductionDate, @endDate, @pi_server, @Debug, 
      @sproc_result OUTPUT 

-- here @sproc_result will have the float value you've assigned to it in the stored procedure body. 
print cast(@sproc_result as varchar(15)) 

примечания, IIRC необходимо указать OUTPUT после возвращения пар как в ст ored процедуры и в вызывающем заявлении.

Обратите внимание, что вы уже передаете @result var в качестве первого параметра в хранимую процедуру. затем просто добавьте модификатор OUTPUT к нему как в определение определения и вызова хранимой процедуры, так и присвойте ему значение в куске хранимой процедуры.Таким образом вам не понадобится новый параметр хранимой процедуры, который я назвал @sproc_result.

HTH

Смежные вопросы