彼らは実際には同等ですが、彼らは独立したタイプ、およびでない技術的に同義語などROWVERSION
とTIMESTAMP
けれども- 彼らは一度にドキュメントの同義語と呼ばれている可能性があり。これは同義語のわずかに異なる意味です(たとえば、名前以外は区別できません。一方が他方のエイリアスではありません)。皮肉ですよね?
MSDNの文言から私が解釈するのは、実際には次のとおりです。
これらのタイプは同一であり、名前が異なるだけです。
以外のtype_id
値は、ここですべてが同じです。
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
この2つの動作の違いについてはまったく知りません。SQLServer 6.5に戻ると、常に100%交換可能として扱ってきました。
DECIMAL(18,2)およびNUMERIC(18,2)の場合?一方を他方に割り当てることは、技術的には「変換」ですか?
明示的に行う場合のみ。これを簡単に証明するには、テーブルを作成してから、明示的または-予想される-暗黙的な変換を実行するクエリのクエリプランを調べます。簡単な表を次に示します。
CREATE TABLE [dbo].[NumDec]
(
[num] [numeric](18, 0) NULL,
[dec] [decimal](18, 0) NULL
);
次に、これらのクエリを実行し、計画をキャプチャします。
DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);
SELECT
CONVERT(DECIMAL(18,0), [num]), -- conversion
CONVERT(NUMERIC(18,0), [dec]) -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [num] = @dec -- no conversion
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [dec] = @num; -- no conversion
SQL Sentry Plan Explorer *に示されているように、計画はあまり面白くありません。
ただし、[式]タブは次のとおりです。
上でコメントしたように、私たちはそれらを要求した明示的な変換はありますが、期待していたかもしれない明示的な変換はありません。オプティマイザーはそれらを交換可能として扱っているようです。
先に進んで、このテストも試してください(データとインデックス)。
CREATE TABLE [dbo].[NumDec2]
(
[num] [numeric](18, 2) NULL,
[dec] [decimal](18, 2) NULL
);
INSERT dbo.NumDec2([num],[dec])
SELECT [object_id] + 0.12, [object_id] + 0.12
FROM sys.all_columns;
CREATE INDEX [ix_num] ON dbo.NumDec2([num]);
CREATE INDEX [ix_dec] ON dbo.NumDec2([dec]);
次のクエリを実行します。
DECLARE @num NUMERIC(18,2) = -1291334356.88,
@dec NUMERIC(18,2) = -1291334356.88;
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = @num
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = @dec;
プランには変換がありません(実際には[式]タブは空です):
これらであっても、予期しない変換は発生しません。もちろん、述語でRHSに表示されますが、シークを容易にするために列データに対して変換を行う必要はありませんでした(スキャンの強制力ははるかに小さくなります)。
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @dec);
個人的には、この用語はDECIMAL
はるかに正確で記述的であるという理由で使用することを好みます。BIT
も「数値」です。
* Disclaimer: I work for SQL Sentry.