Используйте оператор выбора как вход для хранимой процедуры. T- SQL - PullRequest
0 голосов
/ 11 февраля 2020

У меня следующая проблема:

В настоящее время у меня есть хранимая процедура, и когда я ввожу 4 различных параметра, выполняется много вычислений, а затем оператор SELECT для вывода результатов (11 столбцов), например:

usp

Начало этого запроса выглядит следующим образом:

    ALTER PROCEDURE [AGG].[usp_CalculateIsentropeEfficiency] 
(
    @InlaatdrukE INT,
    @InlaattempC INT,
    @UitlaatdrukE INT,
    @UitlaattempC INT
)
AS



/*-------------------------- Omrekenen van druk naar absolute druk en temperatuur naar de eenheid Kelvin. --------------------------*/
DECLARE @InlaatdrukA DECIMAL(20,15)
DECLARE @InlaattempK DECIMAL(20,15)
DECLARE @UitlaatdrukA DECIMAL(20,15)
DECLARE @UitlaattempK DECIMAL(20,15)

SET @InlaatdrukA = @InlaatdrukE + 1.01325
SET @InlaattempK = @InlaattempC + 273.15
SET @uitlaatdrukA = @UitlaatdrukE + 1.01325
SET @UitlaattempK = @UitlaattempC + 273.15

После этой части я объявляю и устанавливаю еще пару переменные. Некоторые ищут значения в справочной таблице, а некоторые просто простые вычисления.

1014 * Идея теперь, что эти различные параметры должны быть заполнены в соответствии с другим отборным заявлением я сделал с шарниром.

Вывод этой сводной таблицы выглядит следующим образом:

pivottable

Где PI,PU,TI и TU - входы для хранимая процедура.

Моя проблема в том, что я не могу запустить хранимую процедуру для каждой строки, поэтому я подумал вставить Pivot Select в хранимую процедуру, чтобы создать таблицу большего размера. Это также не работает, так как я не могу использовать сводную таблицу в качестве входных данных для переменных, с которыми я выполняю вычисления.

Требуемый вывод должен быть сводной таблицей + вычисления. как это:

TimeKey Component PI PU TI TU Q Row# InlaatdrukA InlaattempK Tuit_s, et c.

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

Спасибо, что поделились своим опытом.

Как указано в комментариях, здесь есть еще SQL код с логикой c: В процедуре:

--Inlaat
DECLARE @Lookup_inlaat_templower INT
DECLARE @Lookup_inlaat_druklower INT
DECLARE @Lookup_inlaat_temphigher INT
DECLARE @Lookup_inlaat_drukhigher INT

SET @Lookup_inlaat_templower = (SELECT MAX(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature <= @InlaattempK)
SET @Lookup_inlaat_druklower = (SELECT MAX(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure <= @InlaatdrukA)
SET @Lookup_inlaat_temphigher = (SELECT MIN(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature >= @InlaattempK)
SET @Lookup_inlaat_drukhigher = (SELECT MIN(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure >= @InlaatdrukA)

--Uitlaat
DECLARE @Lookup_uitlaat_templower INT
DECLARE @Lookup_uitlaat_druklower INT
DECLARE @Lookup_uitlaat_temphigher INT
DECLARE @Lookup_uitlaat_drukhigher INT

SET @Lookup_uitlaat_templower = (SELECT MAX(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature <= @uitlaattempK)
SET @Lookup_uitlaat_druklower = (SELECT MAX(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure <= @uitlaatdrukA)
SET @Lookup_uitlaat_temphigher = (SELECT MIN(ref.Temperature) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature >= @uitlaattempK)
SET @Lookup_uitlaat_drukhigher = (SELECT MIN(ref.Pressure) FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Pressure >= @uitlaatdrukA)

/*-------------------------- Interpolatie van de gemeten inlaat temperatuur en druk. --------------------------*/
DECLARE @Isentrope_inlaat_lowertemp_lowerdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_lowertemp_higherdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_highertemp_lowerdruk DECIMAL(19,17)
DECLARE @Isentrope_inlaat_highertemp_higherdruk DECIMAL(19,17)

SET @Isentrope_inlaat_lowertemp_lowerdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_templower AND ref.Pressure = @lookup_inlaat_druklower)
SET @Isentrope_inlaat_lowertemp_higherdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_templower AND ref.Pressure = @lookup_inlaat_drukhigher)
SET @Isentrope_inlaat_highertemp_lowerdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_temphigher AND ref.Pressure = @lookup_inlaat_druklower)
SET @Isentrope_inlaat_highertemp_higherdruk = (SELECT ref.IsentropeCoefficient FROM AGG.tblRefIsentropeEfficiency ref WHERE ref.Temperature = @lookup_inlaat_temphigher AND ref.Pressure = @lookup_inlaat_drukhigher)

DECLARE @IsentropeInlaatG1 DECIMAL(19,17)
DECLARE @IsentropeInlaatG2 DECIMAL(19,17)

SET @IsentropeInlaatG1 = ((@lookup_inlaat_druklower + @Deltax - @InlaatdrukA) * @Isentrope_inlaat_lowertemp_lowerdruk + (@InlaatdrukA - @lookup_inlaat_druklower) * @isentrope_inlaat_lowertemp_higherdruk) / @deltax
SET @IsentropeInlaatG2 = ((@lookup_inlaat_druklower + @Deltax - @InlaatdrukA) * @Isentrope_inlaat_highertemp_lowerdruk + (@InlaatdrukA - @lookup_inlaat_druklower) * @isentrope_inlaat_highertemp_higherdruk) / @deltax

Это просто установка переменных и выполнение расчетов с ними. (это еще не все, но должно дать более глубокое понимание того, как я вычисляю поля. Окончание atm хранимой процедуры просто:

SELECT  InlaatdrukA = @InlaatdrukA, 
        InlaattempK = @InlaattempK, 
        UitlaatdrukA = @UitlaatdrukA, 
        UitlaattempK = @UitlaattempK,
        Interpolate_BL = @InlaatInterpolate_BL,
        Tuit_s = @Tuit_s,
        H1_Interpolate_BL = @H1_Interpolate_BL,
        H2_Interpolate_BL = @H2_Interpolate_BL,
        H2s_Interpolate_BL = @H2s_Interpolate_BL,
        IsentropeEfficiency = @IsentropeEfficiency,
        IsentropeInefficiency = @IsentropeInefficiency

И весь запрос Pivot SQL выглядит так:

with  cte_src as (    
SELECT  
VH.Value,    
VH.TimeKey,   
RIGHT(M.MeasurementOriginalName, CHARINDEX('.', REVERSE(M.MeasurementOriginalName))-1) AS Type,      
SUBSTRING(M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)+1,charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)+1) - charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, charindex('.', M.MeasurementOriginalName, 1))+1)+1)-1)  as Component         

FROM [MSTR].[tblDimMeasurement] M      
INNER JOIN [AGG].[tblTmpFactMeasurementAnalogueValueHour] VH ON VH.MeasurementKey = M.MeasurementKey        

WHERE M.MeasurementOriginalName LIKE ('%A-414-C014%') 
and RIGHT(M.MeasurementOriginalName,2) IN ('PU','PI','TI','TU','.Q')           ),

cte_piv as(
select *, ROW_NUMBER() OVER (ORDER BY TimeKey) as Row# from cte_src  
PIVOT(  MAX(Value)  FOR TYPE IN ([PI],[PU],[TI],[TU],[Q])  )Pivotname  

)


Select * from cte_piv

здесь я выбираю поля, которые мне нужны, и с помощью charindex я проверяю, получаю ли я правильную часть строки.

Затем поворачивайте ее, чтобы получить результат с помощью PI, PU et c как показано выше.

1 Ответ

0 голосов
/ 11 февраля 2020

Я заработал, когда сделал Pivot внутри хранимой процедуры. Затем использовали временные таблицы и заполняли их строкой за строкой. Затем выбрал временную таблицу:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...