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