次の方法で共有


SR0014: {型 1} から {型 2} にキャストするとデータ損失が発生する可能性があります

RuleId

SR0014

カテゴリ

Microsoft.Design

互換性に影響する変更点

なし

原因

列、変数、またはパラメータのデータ型が、暗黙的に別のデータ型に変換されています。

規則の説明

列、変数、またはパラメータに割り当てるデータ型に一貫性がない場合、それらのオブジェクトが含まれた Transact-SQL (T-SQL) コードを実行するときに、データ型は暗黙的に変換されます。 この種類の変換により、パフォーマンスが低下するだけでなく、場合によっては、わずかなデータ損失が発生する可能性があります。 たとえば、WHERE 句のすべての列を変換する必要がある場合、テーブル スキャンが実行されることがあります。 さらに、Unicode 文字列が、異なるコード ページを使用する ASCII 文字列に変換されると、データが損失する可能性があります。

違反の修正方法

一貫性のあるデータ型の割り当てを行い、必要な型に明示的に変換することにより、これらの問題の発生を回避して解決できます。 データ型を明示的に変換する方法の詳細については、Microsoft Web サイトの「CAST および CONVERT (Transact-SQL)」を参照してください。

警告を抑制する状況

この種類の警告は抑制しないでください。

使用例

この例では、テーブルにデータを挿入する 2 つのストアド プロシージャを示します。 最初のプロシージャ procWithWarning は、データ型を暗黙的に変換します。 2 番目のプロシージャ procFixed は、最大のパフォーマンスを得ながらすべてのデータを保持するために明示的な変換を追加する方法を示しています。

CREATE TABLE [dbo].[Table2] 
( 
[ID] INT NOT NULL IDENTITY(0, 1), 
[c1] INT NOT NULL , 
[c2] INT NOT NULL , 
[c3] BIGINT NOT NULL , 
[Comment] VARCHAR (25)
)
ON [PRIMARY]

CREATE PROCEDURE [dbo].[procWithWarning]
(
@Value1 INT,
@Value2 INT,
@Value3 BIGINT,
@Comment CHAR(30)
) 
AS 
BEGIN
INSERT INTO [Table2] ([c1], [c2], [c3], Comment) 
VALUES (@Value1, @Value2, @Value3, @Comment) 

END

CREATE PROCEDURE [dbo].[procFixed]
(
@Value1 INT,
@Value2 INT,
@Value3 BIGINT,
@Comment CHAR(10)
) 
AS 
BEGIN
INSERT INTO [Table2] ([c1], [c2], [c3], Comment) 
VALUES (@Value1, @Value2, @Value3, CAST(@Comment AS VARCHAR(25))) 

END

参照

概念

スタティック分析によるデータベース コードの改善