TSQL /SQLServerでVarcharをIntに「解析」するためのより良い方法があるかどうか疑問に思っています。CAST / CONVERTシステム機能よりも堅牢なものが必要なため、「解析」と言います。解析が失敗した場合、または「デフォルト」値でさえもNULLを返すと特に便利です。
これが私が現在使用している関数で、元々は誰かのSQLブログから取得したものです(具体的に誰を思い出せない)...
ALTERFUNCTION[dbo]。[udf_ToNumber] (( @Str varchar(max) )。 リターンint なので 始める DECLARE @Result int SET @Str = LTRIM(RTRIM(@Str)) IF(@ Str ='' OR @Str IS NULL またはISNUMERIC(@Str)= 0 または@StrLIKE'%[^-+ 0-9]%' または@StrIN('。'、'-'、'+'、'^') )。 SET @Result = NULL そうしないと IF(CAST(@Str AS NUMERIC(38,0))NOT BETWEEN -2147483648。AND2147483647。) SET @Result = NULL そうしないと SET @Result = CAST(@Str AS int) @Resultを返す 終わり
(そして、「@ Resultがnullの場合、@ Result =を設定する」などのように、末尾の前に行を追加できます)。
JOINまたはWHERE-IN-SELECTで使用するため、あまり効率的ではありません。たとえば、LEFT列がINTで、RIGHTがVARCHARであり、非常に大きなデータセットでRIGHTを解析しようとすると、次のようになります。最初にLEFT(INT)列をVARCHARにキャストしてから、JOINを実行する場合よりもはるかに長くなります。
とにかく、テーブル/データ型が適切に作成および入力されていれば、そもそもこの種のことを行う必要はないことを「理想的に」知っていますが、理想的な世界は現実からかけ離れていることもありますが、だから私をユーモア。ありがとう!
編集:SQLServerバージョン2005および2008; 2005を実行しているボックスはまもなくアップグレードされるため、2008固有の回答で問題ありません。