web-dev-qa-db-ja.com

日時からフォーマットされた日付の暗黙的な変換

私はストアドプロシージャの暗黙的な変換を調べていますが、prodデータベースにある最大の変換は、SQL 2014のCardinality Estimatorによる日付時刻のフォーマットされた日付への変換に関する警告です。

私は次の質問を読みました: クエリプランの「カーディナリティの見積もり」の警告 および DateTimeからFormat:Implicit Conversion ですが、FORMAT()は警告を削除することについてこれらは言及していません問題が修正されないことを説明するだけであり、これは私が探している解決策ではありませんが、FORMAT()は実行可能な解決策です。

以前は日付をフォーマットするためにCONVERT()のフォーマットオプションを使用していましたが、いつでもCONVERT()を使用して暗黙の変換を取得しました。

CREATE TABLE #temptable ( [Birthdate] datetime )
INSERT INTO #temptable
VALUES
( N'1891-12-30T00:00:00' ), 
( N'1918-10-31T00:00:00' ), 
( N'1917-12-21T00:00:00' ), 
( N'1906-10-29T00:00:00' ), 
( N'1916-12-12T00:00:00' ), 
( N'1916-11-08T00:00:00' ), 
( N'1918-10-01T00:00:00' ), 
( N'1913-03-18T00:00:00' ), 
( N'1920-08-03T00:00:00' ), 
( N'1919-10-22T00:00:00' )


SELECT CONVERT(VARCHAR(26),t.Birthdate,109) AS varConvert,
        CONVERT(NVARCHAR(26), t.Birthdate, 109) AS nvarConvert,
        TRY_CONVERT(VARCHAR(26),t.Birthdate, 109) AS tryCon,
        FORMAT(t.Birthdate, 'MMM dd yyyy') AS form
FROM #temptable AS t

DROP TABLE #temptable

フォーマットされた日付への暗黙的でない唯一の変換は、FORMAT()関数です。

enter image description here

FORMAT()関数を使用せず、Convert関数を使用してフォーマットされた日付を返す方法はありますか?つまり、変換中にフォーマットされた日付の長さを延長または短縮する必要があります。暗黙的な変換を避けたいのですが、すべてのCONVERT()をFORMAT()に書き直すと、現在のCONVERT機能を変更するよりも多くのテストが必要になります。

2
Vic Work

投稿したクエリは、SQL Server 2016 SP1で実際にPlanAffectingConvert警告を生成します(以前のバージョンでは試行していません)。

これはバグです。これらの変換ステートメントは、SELECT部分​​にある場合でもカーディナリティに影響を与えないため、その警告をスローするべきではありません。

http://connect.Microsoft.com でバグレポートを提出し、再現コードを含め、質問を編集してConnectアイテムへのリンクを含め、他のユーザーが投票できるようにします。

3
Brent Ozar