Généralement lors de la conception de tables, vous voulez savoir ce qui va réellement s'y trouver. Avez-vous un nombre distinct de types de données que vous devez prendre en charge? Avez-vous besoin de couvrir les décimales? Une solution possible serait quelque chose comme ceci:
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
Vous pouvez ensuite utiliser le type de données pour décider de quelle colonne que vous souhaitez sélectionner ou insérer/mettre à jour. Gardez à l'esprit que vous pourriez avoir des problèmes avec l'utilisation:
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 exige que les types de données tout match pour une colonne retournés. Si vous en sélectionnez un seul à la fois, cela peut fonctionner, mais si vous voulez sélectionner des ensembles de données, vous aurez probablement besoin de faire un cast ou de sélectionner uniquement les lignes où les valeurs data_type sont égales. Cependant, je n'ai pas fait de tests sur tous les scénarios, vous devriez donc jouer avec pour voir ce qui fonctionne et ce qui ne fonctionne pas.
Je le répète, vous devriez revoir la conception de votre application. Il est certainement possible que vous ayez besoin de ce type de fonctionnalité, mais souvent, lorsque je vois ce motif de conception, ce que le frontal veut vraiment, c'est une chaîne qui sera affichée dans l'application. Cette chaîne arrive juste à ressembler à un nombre ou une date à la fois. Si vous voulez réellement exécuter des fonctions spécifiques aux types de données sur les données, il est probable qu'un design moins "flexible" soit nécessaire, mais sans connaître toutes vos exigences, je ne peux pas le dire. C'est juste de mon expérience dans le passé.
EDIT: On dirait que je tape trop lentement et que Tony me frappe dessus. :)
Eh bien, je viens de vous voter quand même! –