2011-01-03 5 views
1

SQL Server 2005でXML構造体を作成する必要があります(C-フレーズを借用する必要があります)。これを行うために、私はすべての値をvarcharに変更します。問題は、私がこれらの値のUSEを作成したいときに、私は10進数に変換する必要があります。'null' varcharを10進数に変換する

だから、私のXMLコードは次のようになります。VALがnullの場合

set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>' 

この方法は、私は特別な小数を返すと、私はその小数をチェックすることができます。パフォーマンス以来

case when cast(InvestmentReturn.fn_getSTRUCT(...args...).value('results[1]/VAL[1]', 'varchar(40)')as decimal(10,5)) = -.11111 

:これを行うことの欠点は、私が値を使用する場合、私は、私はそれがこのような0 に値が等しい変換かどうかを確認する必要がもう一方の端にCOALESCEを使用することができないということです私はパフォーマンスを向上させる方法の1つが、ネストされたcase文を使用する代わりに合体を使用し、特別な 'null'同等のものと等しいかどうかをチェックすることが考えられました。

どのような考えですか?

も、私は(小数(10,5)として「NULL」)が選択キャストを見るには、私に与える:

Msg 8114, Level 16, State 5, Line 1 
Error converting data type varchar to numeric. 

答えて

1

パフォーマンスの問題は、多くの要因によって引き起こされる場合があります。

最初はSQL 2005でXMLを使用していますが、使用しているxmlデータのサイズはわかりませんが、特定のサイズの障壁を越えた場合、これを5年前に試してみました(私は32kだったと思いますが、 64kだったかもしれません)、処理性能が崖から落ちました。余分なバイトが1つあれば、クエリは500msから60秒になります。その時点でSQLサーバーがXMLデータを処理することを断念しなければなりませんでした。 C#でその処理を行うのはずっと速かったです。

もう1つは、select文の中で関数を呼び出すことです。その関数を複数の行で操作する必要がある場合は、パフォーマンスが低下します。これを説明するために私が常に使用する1つの例は、GETDATE()です。 GETDATE()の戻り値に変数を設定し、その変数を選択クエリで使用すると、クエリ自体でGETDATE()を呼び出すよりも一桁高速に実行されます。あなたが提供した小さなコードの例は、それが関数を呼び出しているだけなので、キラーかもしれません。

これはあなたの直面する問題に対する良い答えではないかもしれませんが、私は実際にSQLサーバーから任意のXML処理コードを取り除き、あなたが選んだ他の言語でそれを実行するほうがはるかに優れていると思います。

関連する問題