2011-07-31 6 views
1

SQL ServerでXMLを使用することに慣れていないので、このストアドプロシージャを更新し、テーブルに挿入する前にフィールドに数式を適用するように変更するように求めました。ここでSQL ServerでXMLを扱う

は、いくつかのサンプルコードです:

CREATE PROCEDURE [spNewUser] 
    @UserInfo xml 
AS  
BEGIN 
    IF @UserInfo.exist('/UserInfo') = 1 
    BEGIN 
     DECLARE 
      @FirstName varchar(40), 
      @LastName varchar(40), 
      @Height varchar(10) 
     SELECT 
      @FirstName = Personal.query('FirstName').value('.','varchar(25)'), 
      @LastName = Personal.query('LastName').value('.','varchar(50)'), 
      @Height = NULLIF(Personal.query('HeightFt').value('.','varchar(3)') + '.' + Personal.query('HeightIn').value('.','varchar(3)'),'.') 
     FROM 
      @UserInfo.nodes('/UserInfo/Personal') AppInfo(Personal) 
    END 
BEGIN 

は今、私はすべてが起こって(一般的に)理解しています。私たちは何も使っていないので、高さ(フィートとインチ)を'FootValue'.'InchValue'として保存していましたが、今は何かのために使いたいと思っています。これをintとして保存し、インチ数を保存します。私はHeightFt * 12 + HeightInをしたいと思いますが、私は変換して数学を行う最も安全な方法は不明です。 query('HeightFt').value(???)ステートメントを実行する方法がわかりません。私はそれが存在しない場合は0を返すことを望むでしょう。

答えて

2

varchar(10)ではなく数値として数値を格納することをお勧めします。基本的には、XMLからこれらの値を抽出する必要があり、その後、その後、あなたの計算を行います。

DECLARE 
    @FirstName varchar(40), 
    @LastName varchar(40), 
    @HeightFt decimal(16, 4), 
    @HeightIn decimal(16, 4) 

SELECT 
    @FirstName = Personal.value('(FirstName)[1]', 'varchar(25)'), 
    @LastName = Personal.value('(LastName)[1]', 'varchar(50)'), 
    @HeightFt = ISNULL(Personal.value('(HeightFt)[1]', 'DECIMAL(6, 1)'), 0.0), 
    @HeightIn = ISNULL(Personal.value('(HeightIn)[1]', 'DECIMAL(6, 1)'), 0.0) 
FROM 
    @UserInfo.nodes('/UserInfo/Personal') AppInfo(Personal) 

DECLARE @Calculated DECIMAL(8, 2) 

SET @Calculated = @HeightFt * 12 + @HeightIn 
+0

'DECIMAL(16,4)'フィート:) –

+0

で身長のためにどのような意志HeightFt'または ''場合は、このリターンHeightIn'は存在しません? –

+0

@Remus:ok、sure - ここには当てはまらない。それはちょうど私の「通常の」デフォルトです(請求書やそのようなもののため)...必要に応じて適応します:-) –