Devrais-je utiliser le type de données SQL_Variant?
à l'aide de SQL Server 2005 service pack 4 et je suis en train de concevoir une table de base de données.
Voici le tableau DDL
CREATE TABLE CPSync4D.ProjectProfilerOption
(
ProjectProfilerOptionID INT IDENTITY(1,1) CONSTRAINT PK_ProjectProfilerOption_ProjectProfilerOptionID PRIMARY KEY
,ProjectID INT CONSTRAINT FK_ProjectProfilerOption_Project_ProjectID FOREIGN KEY(ProjectID) REFERENCES CPSync4D.Project(ProjectID) ON DELETE CASCADE
,ProfilerOptionID TINYINT CONSTRAINT FK_ProjectProfilerOption_ProfilerOption_ProfilerOptionID FOREIGN KEY(ProfilerOptionID) REFERENCES CPSync4D.ProfilerOption (ProfilerOptionID)
,ProfilerOptionValue sql_variant NOT NULL
)
Go
profileroptionvalue colonne peut contenir une chaîne de caractères jusqu'à 30 caractères, entier ou décimal des valeurs par exemple, les valeurs sont "ProfilerValueType", ou 12.52 ou 20, etc. (pas plus de deux décimales et les valeurs entières sont à moins de 100)
Dois-je utiliser sql_variant ou varchar(30)...? Je n'ai jamais utilisé sql_variant avant et de ne pas s'assurer de l'implication de ne pas utiliser en termes de conception de base de données.
Tout pièges de l'utilisation sql_variant...avec .net code
Vous devez vous connecter pour publier un commentaire.
10 raisons de convertir explicitement les types de données SQL Server
Je n'ai pas utilisé
sql_variant
avant, mais avec ces restrictions et les conséquences de performance à l'esprit, je voudrais tout d'abord chercher d'autres solutions.Suivante serait pour moi la plus à la moins préférée solution
VARCHAR
colonne de sorte que vous pouvez au moins utiliserLIKE
consolidés.sql_variant
type de données.Modifier Duco à ta.speot.est
Variantes peut sera le cadre d'une primaire de clé étrangère
sql_variant
à d'autres types de données?sql_variant
binaire, il ya donc un certain niveau d'inférence de la part de la demande passe..ODBC does not fully support sql_variant. Therefore, queries of sql_variant columns are returned as binary data when you use Microsoft OLE DB Provider for ODBC (MSDASQL). For example, a sql_variant column that contains the character string data 'PS2091' is returned as 0x505332303931.
msdn.microsoft.com/en-us/library/ms173829.aspx..sql_variant
, et l'auteur est incorrect dans son affirmation de datetime composants et les conversions:SELECT CONVERT(date, GETDATE(), 0), CONVERT(time(7), GETDATE(), 0)
sql_variant
avec un grand succès. De même, je suis sûr que vous trouverez des gens qui ont eu à s'abstenir d'eux.sql_variant
, pas à l'encontre de la conception de tables qui utilisentsql_variant
. "convertir explicitementsql_variant
types de données que vous utilisez."Je sais que ma réponse est un peu tardive mais la table ici ressemble un peu à une application de configuration de la table. Comme une alternative à la des suggestions, nous allons penser à ne pas nous limiter à 30 ou même 8000 caractères. Nous allons également rendre un peu plus autonome et définissables par l'utilisateur.
Avec ces pensées à l'esprit, pourquoi ne pas sauver le "profil" de l'information comme un type de données XML qui serait à même de permettre plusieurs niveaux de réglages? Vous n'auriez probablement pas besoin d'autant de colonnes que ProfilerOptionID plus et peut-être en mesure d'obtenir ce à un simple contrôle de la table.
Il est intéressant de noter qu'il n'est pas possible de copier la colonne sql_variant implicitement.
par exemple, Créer une sauvegarde de schéma de CPSync4D.ProjectProfilerOption appelé CPSync4D.ProjectProfilerOption_bkp
et puis
Toutes les valeurs pour ProfilerOptionValue dans la table de sauvegarde seront varchar
Note: j'ai dit que le SQL_Variant ne peut pas être utilisé dans la réplication, mais ce n'est pas vrai. Certes, il peut être fait avec SQL 2008 R2 (que j'utilise) parce que je viens de le faire, mais cela peut ont été vrai pour les anciennes versions (je n'ai pas toutes les anciennes versions de vérifier avec donc impossible de confirmer ou d'infirmer cette).
Ce qui est vrai, cependant, est que si vous faites reproduire un tableau avec un SQL Variante en elle et ont beaucoup de données, puis quelque chose se passe mal et vous devez corriger les données manuellement, alors vous pourriez avoir un mauvais morceau de SQL pour écrire. C'est parce que lors de la copie des données vous ne pouvez pas copier avec plusieurs types de base dans la même copie de la déclaration. Je suppose que la réplication n'a pas ce problème, car il ne permet pas de copier plusieurs lignes (à l'exception évidente de l'instantané, mais qui utilise bcp).
ps. Je me rends compte que c'est un vieux post, mais mettre ce ici pour de futurs autres visiteurs avec la même question.