昨日書いたSQLServerでシーケンスの現在値を取得するという方法、
SELECT current_value FROM sys.sequences WHERE name = 'シーケンス名';
実は
ODBC接続で現在値を取得しようとすると下記のエラーが出てしまう。
「 3017, フィールド サイズが長すぎます。」
検索しても出てこないが、恐らくsys.sequencesのデータ型がsql_variant型の為に、ODBCで処理出来ないのが原因ではないかと推察。
テーブルで
SELECT TOP1 連番フィールド名 FROM テーブル名 ORDER BY 連番フィールド名 DESC;
でも最後の値は取得は出来るが、データテーブルに何十万件と入っている為、いまいち実行が遅い。。
業務処理では1秒の遅れが致命的な使いづらさとなる。
色々試した結果、
ユーザー定義関数をSQLServer内で作って、戻り値としてNumeric型に変換して取得する事にした。
CREATE FUNCTION GetCurValue(
@Syquencer varchar(50), --シーケンサーの名前
)
RETURNS NUMERIC
AS
BEGIN
DECLARE @fieldValue sql_variant; --sysテーブルのデータ型がsql_variantの為、一時的に保持するデータ型をこの形にしています。
@CurValue numeric(10,0) --戻り値。
SELECT @fieldValue = (SELECT current_value FROM sys.sequences WHERE name = @Syquencer);
select @CurValue = convert(numeric(10,0),@returnValue);
RETURN(@CurValue)
END
で、ODBC接続側で関数を実行
SELECT dbo.GetCurValue('シーケンサー名') AS RESULT;
で無事取得できました。
め、めんどくせ~!
でも、だいぶ早い!