【SQLServer】ODBCでシーケンスの現在値を取得する。 | hirakawatomohideのブログ

hirakawatomohideのブログ

ブログの説明を入力します。

テーマ:
昨日書いた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;


で無事取得できました。
め、めんどくせ~!
でも、だいぶ早い!