一般に、テーブルを設計するときは、実際にテーブルに何が含まれるかを知りたいと思います。サポートする必要のあるデータ型の数は明確ですか?小数をカバーする必要がありますか?考えられる解決策の1つは、次のようなものです。
CREATE TABLE dbo.My_Table (
id INT NOT NULL,
data_type VARCHAR(10) NOT NULL,
string_value VARCHAR(100) NULL,
int_value INT NULL,
date_value DATETIME NULL,
CONSTRAINT CK_My_Table_data_type CHECK data_type IN ('int', 'string', 'datetime'),
CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id)
)
GO
次に、データ型を使用して、選択または挿入/更新する列を決定できます。ただし、以下の使用で問題が発生する可能性があることに注意してください。
SELECT
id,
CASE data_type
WHEN 'string' THEN string_value
WHEN 'int' THEN int_value
WHEN 'datetime' THEN date_value
ELSE NULL
END
SQL Serverでは、返される列のデータ型がすべて一致している必要があります。一度に1つしか選択しない場合は問題なく機能する可能性がありますが、データセットを選択する場合は、とにかくキャストを行うか、data_type値が等しい行のみを選択する必要があります。ただし、すべてのシナリオでテストを行ったわけではないので、テストを試して、何が機能し、何が機能しないかを確認する必要があります。
ただし、もう一度言いますが、アプリケーションの設計をもう一度確認する必要があります。この種の機能が必要な可能性は確かにありますが、このデザインパターンを見ると、フロントエンドが本当に必要としているのは、アプリケーションに表示される文字列であることがよくあります。その文字列は、たまたま数字や日付のように見えることがあります。実際にデータに対してデータ型固有の機能を実行する場合は、「柔軟性の低い」設計が求められる可能性がありますが、すべての要件を知らなければ、私には言えません。これは過去の私の経験からです。
編集:私が入力するのが遅すぎるようで、トニーは私をそれに打ち負かしました。:)