SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Nexus で System.Data.SqlClient.SqlException (0x80131904) が発生した場合の対応方法

leave a comment

SQL Nexus でレポートを作成する際に、一部の内容 (例: Perfmon Summary の Click here to view more CPU metrics) を表示する際に、次のエラーが発生することがあります。

System.Data.SqlClient.SqlException (0x80131904): 文字列から日付と時刻、またはそのいずれかへの変換中に、変換が失敗しました。 (英語だと Conversion failed when converting date and/or time from character string.)

原因については Perfmon CPU and Memory Reports failing with date time cast issue で報告がされており、取得データを成形するために使用している Relog の問題のようです。

問題が発生しているのは、「CounterData」というテーブルの CounterDateTime の日付データになります。この列は日付型データではなく、varchar(24) 日付形式の文字列となり、テーブルに対して SELECT を実行すると、一見すると正しいデータが入っているように見えます。

image

しかしこのデータを日付型の列を持つテーブルに INSERT 使用とすると上述のようなエラーが発生することが SSMS からのクエリ実行でも確認ができます。

image

上記のデータであれば「2022-12-21 12:01:06.533」という 23 文字の文字列なのですが、テーブルのデータ型が 24 バイトで確保されているところが、問題解決のポイントとなるようですね。

データを確認すると Issue で報告されているように最後に「00」というデータが含まれているようです。

image

最後の 1 バイトは削るかスペースに置き換えることでエラーを回避できるので、Issue に記載されている Update か、最後の一文字を削る Update のいずれかを実行することでエラーが解消しレポートを開くことができるようになります。

update counterdata set CounterDateTime =substring(CounterDateTime, 1,23) + char(32) from counterdata
update counterdata set CounterDateTime =substring(CounterDateTime, 1,23) from counterdata

image

Share

Written by Masayuki.Ozawa

12月 21st, 2022 at 3:22 pm

Posted in SQL Server

Tagged with

Leave a Reply