2013-01-21 57 views
0

我正在構建一個存儲過程,該存儲過程將作爲配置字符串代碼讀取器,它將採用@config varchar(255)變量。如何創建返回臨時表?

This 配置字符串決定我們模型中的26個設置。

就拿配置字符串項之一:

declare @casingType varchar(50); 
set @casingType=case SubString(@config, 34, 1) 
    when '1' then 'U-Flange - All Around w/ Stacking Flanges' 
    when '2' then 'U-Flange - All Around' 
    when '3' then 'U-Flange - No Top & Bottom' 
    when '4' then 'U-Flange - Flat Top & Bottom' 
    when '5' then 'Box Bracket - End Plates Only' 
    when '6' then 'Box Bracket - All Around' 
    when '7' then 'Slip & Drive Bracket' 
    when '8' then 'L Flange' 
    when '0' then 'No Casing' 
    when 'A' then '3 Sided Box - No Top & Bottom' 
    when 'B' then '3 Sided Box - Top & Bottom' 
    when 'C' then '3 Sided Box - Top or Bottom' 
    when 'D' then 'U-Flange w/ Stacking Plates' 
    when 'E' then 'U-Flange Temp Top & Bottom' 
    when 'F' then 'Flat Bracket' 
    when 'G' then 'A Coil Slab Bracket' 
    when 'H' then '2 Sided Box' 
    when 'I' then '3 Sided Box w/ Temp Top & Bottom' 
    when 'O' then 'One Plus One Casing' 
    when 'X' then 'Special' 
    when 'Y' then 'Auto Braze' 
    else 'Error' end; 

我想返回是一個包含每個項目的文本字段一(1)行的表。

我是否創建臨時表來返回或創建其他類型的表來返回?

我希望這是有道理的。我可能錯誤地使用了它,或者使用了不適當的SQL術語。

解決方案:所以,我得到了這個工作,這裏是我用來做它的代碼。

通常我們的銷售人員或工程師從配置字符串不知道某個字母意味着什麼,所以他們必須查找它。超過70%的時間,這導致更多的字母代碼搜索。所以,我們只想返回與特定配置相關的所有細節。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Joe Pool 
-- Create date: 21-22 January 2013 
-- Description: This returns a DataTable representation of the Model Configuration 
-- ============================================= 
CREATE PROCEDURE sp1_Configurator(@config varchar(255)) as 
BEGIN 
SET NOCOUNT ON; 
declare @len int; 
declare @coilType varchar(50), @coilPattern varchar(50), @rowsDeep varchar(50); 
declare @finHeight varchar(50), @finLength varchar(50), @finThickMat varchar(50); 
declare @finPerInch varchar(50), @finTreatment varchar(50), @finCoating varchar(50); 
declare @tubeWallThk varchar(50), @tubeType varchar(50), @qty varchar(50); 
declare @tubeCoat varchar(50), @gauge varchar(50), @material varchar(50); 
declare @casingType varchar(50), @customerCode varchar(50), @caseCoat varchar(50); 
declare @arrangement varchar(50), @connType varchar(50), @connSize varchar(50); 
declare @distributor varchar(50), @circuitry varchar(50), @coilApp varchar(50); 
declare @agency varchar(50), @outsideCoat varchar(50); 
declare @table table (
    CoilType varchar(50) null, CoilPattern varchar(50) null, RowsDeep varchar(50) null, 
    FinHeight varchar(50) null, FinLength varchar(50) null, FinThickMat varchar(50) null, 
    FinPerInch varchar(50) null, FinTreatment varchar(50) null, FinCoating varchar(50) null, 
    TubeWallThk varchar(50) null, TubeType varchar(50) null, Qty varchar(50) null, 
    TubeCoat varchar(50) null, Gauge varchar(50) null, Material varchar(50) null, 
    CasingType varchar(50) null, CustomerCode varchar(50) null, CaseCoat varchar(50) null, 
    Arrangement varchar(50) null, ConnType varchar(50) null, ConnSize varchar(50) null, 
    Distributor varchar(50) null, Circuitry varchar(50) null, CoilApp varchar(50) null, 
    Agency varchar(50) null, OutsideCoat varchar(50) null 
); 
set @len=Len(@config) 
if (@len=53) begin 
    set @coilType=case SubString(@config, 1, 1) 
    when 'C' then 'Slab' 
    when 'B' then '1 + 1' 
    when 'A' then 'A Coil (OBS)' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @coilPattern=case SubString(@config, 2, 1) 
    when '7' then '7mm Tube (.827 x .472 Staggered)' 
    when '6' then '5/16" Tube (1 x 5/8 Staggered)(OBS)' 
    when '3' then '3/8" Tube (1 x .866 Staggered)' 
    when 'P' then '1/2" Tube (1 1/4 x 1.08 Staggered)' 
    when '5' then '5/8" Tube (1 1/2 x 1.299 Staggered)' 
    else 'Error' end; 
    set @rowsDeep=SubString(@config, 3, 2); 
    set @finHeight=SubString(@config, 6, 5); 
    set @finLength=SubString(@config, 12, 6); 
    set @finThickMat=case SubString(@config, 19, 1) 
    when 'A' then '.0045 AL (OBS)' 
    when 'J' then '.0055 AL (OBS)' 
    when 'B' then '.0060 AL' 
    when 'C' then '.0075 AL' 
    when 'D' then '.0100 AL' 
    when 'E' then '.0045 CU (OBS)' 
    when 'K' then '.0050 CU (OBS)' 
    when 'F' then '.0060 CU' 
    when 'G' then '.0075 CU (OBS)' 
    when 'H' then '.0100 CU (OBS)' 
    when 'P' then '.0065 Pre-Coated' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @finPerInch=SubString(@config, 20, 2); 
    set @finTreatment=case SubString(@config, 22, 2) 
    when 'FS' then 'Flat/Straight (OBS)' 
    when 'FR' then 'Flat/Rippled (OBS)' 
    when 'CS' then 'Corrugated/Straight (OBS)' 
    when 'CR' then 'Corrugated/Rippled' 
    when 'SS' then 'Sine/Straight (OBS)' 
    when 'SR' then 'Sine/Rippled' 
    when 'LS' then 'Louvered/Straight (OBS)' 
    when 'LR' then 'Louvered/Rippled (OBS)' 
    when 'RL' then 'Embossed Arch/Rippled*' 
    when 'XX' then 'Special' 
    else 'Error' end; 
    set @finCoating=case SubString(@config, 24, 1) 
    when 'N' then 'See Coil Coating' 
    when 'A' then 'Alodine (OBS)' 
    when 'K' then 'Technicoat' 
    when 'P' then 'Paint Bond' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @tubeWallThk=case SubString(@config, 26, 1) 
    when 'A' then '.012 Smooth (5/16)(OBS)' 
    when 'B' then '.014 Smooth (3/8)(OBS)' 
    when 'C' then '.017 Smooth (1/2)' 
    when 'D' then '.018 Smooth (5/8)' 
    when 'E' then '.025 Smooth (1/2, 5/8)' 
    when 'F' then '.035 Smooth (1/2, 5/8)' 
    when 'G' then '.049 Smooth (5/8)' 
    when 'H' then '.012 Rifled (3/8)' 
    when 'K' then '.012 Rifled (7mm)' 
    when 'L' then '.016 Rifled (7mm) (OBS)' 
    when 'P' then '.06 Rifled (1/2)' 
    when 'X' then 'Special (.016 Rifled 3/8)(OBS)' 
    else 'Error' end; 
    set @tubeType=case SubString(@config, 27, 1) 
    when '1' then 'ST Flexpand' 
    when '2' then 'ST ALL DL Flexpand' 
    when '3' then 'ST w/DLST Flexpand' 
    when '5' then 'HP Flexpand' 
    when '6' then 'HP w/ST Flexpand' 
    when 'A' then 'ST w/DL*' 
    when 'B' then 'HP w/DL*' 
    when 'C' then 'Hairpin w/Straight*' 
    when 'D' then 'Hairpin 1/Hairpin .8* (OB)' 
    when 'E' then 'HP/DL/ST*' 
    when 'F' then 'HP/DL/ST/ST DL*' 
    when 'G' then 'HP/DL ST*' 
    when 'H' then 'Hairpint (HP)' 
    when 'I' then 'HP/ST/DL HP*' 
    when 'J' then '.8 HP* (OBS)' 
    when 'K' then 'One Short HP/One Long HP*' 
    when 'L' then 'HP w/Special DL*' 
    when 'M' then 'HP w/Special DL/ST*' 
    when 'N' then 'HP 1/HP .8/ST* (OBS)' 
    when 'O' then 'HP 1/HP .8/DL 1 HP/DL .8 HP* (OBS)' 
    when 'P' then 'All DL ST' 
    when 'Q' then 'ST w/Special DL ST*' 
    when 'R' then 'HP .8/ST* (OBS)' 
    when 'S' then 'Straight (ST)' 
    when 'T' then 'Hydro Ball (HB)' 
    when 'U' then 'HB w/ DL*' 
    when 'V' then 'ST w/Spin Down*' 
    when 'W' then 'HP 7mm .827/.627 Angle*' 
    when 'Y' then 'HP 7mm All .627*' 
    when 'X' then 'Special*' 
    else 'Error' end; 
    set @qty=SubString(@config, 28, 2); 
    set @tubeCoat=case SubString(@config, 30, 1) 
    when 'N' then 'No Coating' 
    when 'T' then 'Tinned Plating (OBS)' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @gauge=case SubString(@config, 32, 1) 
    when '2' then '20 Gauge' 
    when '8' then '18 Gauge' 
    when '6' then '16 Gauge' 
    when '4' then '14 Gauge' 
    when '5' then '0.050" THK' 
    when '3' then '0.063" THK' 
    when '9' then '0.090" THK' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @material=case SubString(@config, 33, 1) 
    when 'G' then 'Galvanized' 
    when 'S' then 'Stainless' 
    when 'C' then 'Copper' 
    when 'A' then 'Aluminum' 
    when 'P' then 'Paint Bond' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @casingType=case SubString(@config, 34, 1) 
    when '1' then 'U-Flange - All Around w/ Stacking Flanges' 
    when '2' then 'U-Flange - All Around' 
    when '3' then 'U-Flange - No Top & Bottom' 
    when '4' then 'U-Flange - Flat Top & Bottom' 
    when '5' then 'Box Bracket - End Plates Only' 
    when '6' then 'Box Bracket - All Around' 
    when '7' then 'Slip & Drive Bracket' 
    when '8' then 'L Flange' 
    when '0' then 'No Casing' 
    when 'A' then '3 Sided Box - No Top & Bottom' 
    when 'B' then '3 Sided Box - Top & Bottom' 
    when 'C' then '3 Sided Box - Top or Bottom' 
    when 'D' then 'U-Flange w/ Stacking Plates' 
    when 'E' then 'U-Flange Temp Top & Bottom' 
    when 'F' then 'Flat Bracket' 
    when 'G' then 'A Coil Slab Bracket' 
    when 'H' then '2 Sided Box' 
    when 'I' then '3 Sided Box w/ Temp Top & Bottom' 
    when 'O' then 'One Plus One Casing' 
    when 'X' then 'Special' 
    when 'Y' then 'Auto Braze' 
    else 'Error' end; 
    set @customerCode=case SubString(@config, 35, 5) 
    when '00' then 'Standard' 
    when '14' then 'AAON Damper' 
    when '15' then 'AAON Cond.' 
    when '16' then 'AAON Evap.' 
    when 'XX' then 'Special' 
    else 'Error' end; 
    set @caseCoat=case SubString(@config, 37, 1) 
    when 'N' then 'See Coil Coating' 
    when 'A' then 'Alodine (OBS)' 
    when 'C' then 'Ceramic' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @arrangement=SubString(@config, 39, 2); 
    set @connType=case SubString(@config, 41, 1) 
    when '0' then 'No Connection' 
    when 'M' then 'MPT' 
    when 'F' then 'FPT' 
    when 'S' then 'Sweat' 
    when 'W' then 'Water Bead (OBS)' 
    when 'B' then 'Barbed FTG (OBS)' 
    when 'N' then 'Male Flare' 
    when 'G' then 'Female Flare' 
    when 'O' then 'Male O-Ring (OBS)' 
    when 'P' then 'Female O-Ring (OBS)' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @connSize=case SubString(@config, 42, 1) 
    when '0' then 'No Connection' 
    when '1' then '3/8 OD' 
    when '2' then '1/2 OD' 
    when '3' then '5/8 OD' 
    when '4' then '7/8 OD' 
    when '5' then '1-1/8 OD' 
    when '6' then '1-3/8 OD' 
    when '7' then '1-5/8 OD' 
    when '8' then '2-1/8 OD' 
    when '9' then '2-5/8 OD' 
    when 'A' then '3-1/8 OD' 
    when 'B' then '5/16 OD' 
    when 'C' then '3/4 OD' 
    when 'D' then '4-1/8 OD' 
    when 'E' then '3/16 OD' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @distributor=case SubString(@config, 44, 4) 
    when 'N000' then 'None Required' 
    when 'X001' then 'Special' 
    else 'Factory Assigned' end; 
    set @circuitry=case SubString(@config, 49, 2) 
    when 'SS' then 'Single Circuit' 
    when 'FF' then 'Full' 
    when 'HH' then 'Half' 
    when 'QQ' then 'Quarter' 
    when 'DD' then 'Double' 
    when 'DH' then '1-1/2' 
    when 'II' then 'Intertwined <2' 
    when 'RS' then 'Row Split <2' 
    when 'FS' then 'Face Split <2' 
    when '00' then 'No Circuitry' 
    when '01' then 'One Circuit' 
    when '02' then 'Two Circuits' 
    when '03' then 'Three Circuits' 
    when '04' then 'Four Circuits' 
    when '0S' then 'No Circuitry + SubCooler' 
    when '1S' then 'One Circuit + SubCooler' 
    when '2S' then 'Two Circuits + SubCooler' 
    when '3S' then 'Three Circuits + SubCooler' 
    when 'XX' then 'Special' 
    else 'Error' end; 
    set @coilApp=case SubString(@config, 51, 1) 
    when 'D' then 'Drainable Water' 
    when 'W' then 'Water' 
    when 'G' then 'Cond/SubCooler' 
    when 'C' then 'Condenser' 
    when 'E' then 'Evaporator' 
    when 'S' then 'Steam' 
    when 'N' then 'Steam Distributor' 
    when 'B' then 'Booster' 
    when 'H' then 'Heat Reclaim' 
    when 'P' then 'Heat Pipe (OBS)' 
    when 'L' then 'Glycol' 
    when 'O' then 'Oil (OBS)' 
    when 'X' then 'Special' 
    else 'Error' end; 
    set @agency=case SubString(@config, 52, 1) 
    when '0' then 'None' 
    when 'A' then 'ARI' 
    when 'B' then 'ARI + UL/CSA' 
    when 'C' then 'UL/CSA' 
    when 'E' then 'ETL/DOE' 
    else 'Error' end; 
    set @outsideCoat=case SubString(@config, 53, 1) 
    when 'N' then 'No Coating' 
    when 'A' then 'Ceramic' 
    when 'C' then 'Chromocoat' 
    when 'E' then 'Epoxy' 
    when 'G' then 'Americoat Grey (OBS)' 
    when 'H' then 'Heresite' 
    when 'K' then 'Phenolic (Technicoat)' 
    when 'L' then 'ElectroFin' 
    when 'P' then 'Phenolic (OBS)' 
    when 'X' then 'Special' 
    else 'Error' end; 
    insert into @table 
    (CoilType, CoilPattern, RowsDeep, FinHeight, FinLength, FinThickMat, FinPerInch, FinTreatment, FinCoating, 
    TubeWallThk, TubeType, Qty, TubeCoat, Gauge, Material, CasingType, CustomerCode, CaseCoat, Arrangement, 
    ConnType, ConnSize, Distributor, Circuitry, CoilApp, Agency, OutsideCoat) 
    values 
    (@coilType, @coilPattern, @rowsDeep, @finHeight, @finLength, @finThickMat, @finPerInch, @finTreatment, @finCoating, 
    @tubeWallThk, @tubeType, @qty, @tubeCoat, @gauge, @material, @casingType, @customerCode, @caseCoat, @arrangement, 
    @connType, @connSize, @distributor, @circuitry, @coilApp, @agency, @outsideCoat); 
end 
select * from @table; 
END 
GO 

下面是一個實際的配置字符串的樣子:

CP06-51.25-051.50-B12SRN-CT00N-8G2XXN-A2S8-N000-HHWAN

+0

你能描述一下你需要做什麼這個表格顯示你想要輸出的樣子,並顯示樣本數據,所以我們有一些想法是什麼「每個項目的文本字段」是什麼意思? –

+0

我只希望我們的開發人員能夠從我們的服務器上獲取信息,並按列名獲取數據。通過將其放置在數據庫中的服務器上,我們可以在模型更改時快速更改。 – jp2code

+0

對不起,我不認爲這回答我的問題。哦,希望bluefeet的答案適合你。

回答

2

有你想到創建用戶定義的功能:

​​

你會再傳給你@config值轉換成類似這樣的功能:那麼

select dbo.CastingTypeFunction(@config) 

你的價值將被退回。

參見SQL Fiddle with Demo

我可以看到您的另一個選項是創建一個包含這些值的表,並且您將加入該表以返回casingType

該表將與此類似:

CREATE TABLE CasingType 
    ([CasingTypeId] varchar(1), [CasingValue] varchar(41)) 
; 

然後你會加入它與此類似:

select 
    case 
    when c.casingtypeid is null 
    then 'Error' 
    else c.casingvalue end 
from 
(
    select '12323212334234231211231212121qwe1212312334234234' config -- replace with your config values 
) src 
left join CasingType c 
    on SubString(src.config, 34, 1) = c.casingtypeid 

SQL Fiddle with Demo

+0

你能告訴你爲什麼在最後一個查詢中選擇了select-case-syntax嗎?個人喜好?那麼'isnull(c.casingvalue,'Error')'呢?謝謝! – Nico

+0

@Nico我只是這樣寫的,你也可以使用coalesce等來檢查null。 – Taryn

+0

這可能是我想要做的。我只是不確定是否需要將其創建到臨時表#CastingType中,或者是否應在從中選擇數據後刪除該表。 – jp2code