彼の記事で、この文字列を整数に変換できますか?、Itzik Ben-Ganは、純粋なT-SQLと、CLRを使用する別のソリューションを提供します。
どのソリューションを選択する必要がありますか?
T-SQLまたはCLRソリューションの方が優れていますか? T-SQLソリューションを使用する利点は、T-SQLプログラミングのドメインの外に出る必要がないことです。ただし、CLRソリューションには2つの重要な利点があります。それは、よりシンプルで高速です。1,000,000行のテーブルに対して両方のソリューションをテストしたところ、CLRソリューションの実行には(T-SQLソリューションの場合)7秒ではなく、2秒かかりました。したがって、次に特定の文字列を整数に変換できるかどうかを確認する必要がある場合は、この記事で提供したT-SQLまたはCLRソリューションを含めることができます。
T-SQLのみを保守する場合は、純粋なT-SQLソリューションを使用してください。利便性よりもパフォーマンスが重要な場合は、CLRソリューションを使用してください。
純粋なT-SQLソリューションには注意が必要です。組み込みのISNUMERIC関数をパターンマッチングおよびキャストと組み合わせて、文字列がintを表すかどうかをチェックします。
SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
CASE
WHEN ISNUMERIC(string) = 0 THEN 0
WHEN string LIKE '%[^-+ 0-9]%' THEN 0
WHEN CAST(string AS NUMERIC(38, 0))
NOT BETWEEN -2147483648. AND 2147483647. THEN 0
ELSE 1
END AS is_int
FROM dbo.T1;
CLRソリューションのT-SQL部分はより単純です。ISNUMERICを呼び出すのと同じように、fn_IsInt関数を呼び出します。
SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
dbo.fn_IsInt(string) AS is_int
FROM dbo.T1;
C#の部分は、.NETの解析関数Int32.TryParseの単なるラッパーです。これは、SQLServerintと.NETInt32が両方とも32ビットの符号付き整数であるために機能します。
using System;
using System.Data.SqlTypes;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean fn_IsInt(SqlString s)
{
if (s.IsNull)
return SqlBoolean.False;
else
{
Int32 i = 0;
return Int32.TryParse(s.Value, out i);
}
}
};
これらのコードサンプルの完全な説明については、Itzikの記事をお読みください。