N'NULL avoir un type de données?
Je suis tombé sur un code similaire à celui d'aujourd'hui.
SELECT AuditDomain,
ObjectId,
AuditSubdomain = CONVERT(VARCHAR(50), NULL),
SubDomainObjectId = CONVERT(INT, NULL)
FROM Audit
Il semble impliquer que les informations de type de données peut être associée à une valeur NULLE. Est-ce à associer des métadonnées à la valeur NULLE de l'identifier comme le type de données spécifié?
Ce post détails un moyen de trouver un type de données dans Sql Server, mais quand j'ai essayer la ligne suivante, il revient à NULL:
SELECT CAST(SQL_VARIANT_PROPERTY(CONVERT(INT, NULL), 'BaseType') AS VARCHAR(20))
- avez-vous essayé de googler "null type de données"? Vous pouvez constater que ce n'est pas un type de données... et la raison pour laquelle le code ci-dessus fonctionne est parce qu'un varchar peut être null.
Vous devez vous connecter pour publier un commentaire.
Dans SQL Server,
NULL
est unINT
par défaut dans tous les scénarios que je pense. Vous pouvez le déterminer avec le code suivant:Résultats:
Avant que vous avez mis dans une table ou autrement associés avec certains des métadonnées contextuelles, ce qui fait que vous acheter? Quelle différence cela fait-il qu'il est
INT
ouDATETIME
ou autre chose? Qu'allez-vous faire avec cette information?SQL_VARIANT_PROPERTY
retourneNULL
parce qu'elle semble exiger à la fois les métadonnées et une valeur significative. Observer (à l'aide d'un type différent juste pour mélanger):Résultats:
De sorte qu'il semble avoir besoin d'un type et une valeur afin de déterminer précisément le type de base.
Comme pour exactement pourquoi cela fonctionne de cette façon, haussement d'épaules. Vous devriez demander à des personnes avec l'accès au code source.
Noter que
NULL
n'a qu'à adopter un type de base lorsque vous avez forcé SQL Server main: vous avez créé une table basée sur elle. Il pourrait très bien avoir été le cas que SQL Server renvoie une erreur dans cette situation (et, en fait, de nombreuses situations où il faut deviner à quel type de données que vous avez voulu dire). La façon de l'éviter est de ne pas créer des situations où SQL Server a deviner (c'est pourquoi j'ai demandé, qu'allez-vous faire avec cette information?).sql_variant_property
fonction est de retourNULL
?NULL
sans le convertir aurait fonctionné, mais peut-être cela peut dépendre de ce que la première table dans laUNION
avait des colonnes manquantes.UNION
):SELECT CAST(NULL AS int) UNION SELECT 'abc'
vsSELECT NULL UNION SELECT 'abc'
. L'ancien échoue parce queint
a une priorité plus élevée quevarchar
, une erreur est signalée pour la invalid conversion de'abc'
de typeint
. Ce dernier réussit, donc, apparemment, ne permet pas de traiterNULL
de typeint
. Pourtant, la sémantique pourUNION
ne spécifier que les types sont déterminés pour toutes les colonnes de toutes les sous-requêtes.Null n'a pas de type de données. Le but d'une valeur null est de représenter un "inconnu", à la fois en valeur et le type.
ISNULL() retourne le type de données pour le premier argument avec un type de données qui lui sont présentées.
http://msdn.microsoft.com/en-us/library/ms187928.aspx
Je sais que vous avez déjà quelques bonnes réponses mais SQL_VARIANT_PROPERTY, je pense, a été mal compris.
Vous utilisez SQL_Variant_Property avec une colonne et une indication de ce que vous voulez sur les propriétés de métadonnées. Toutefois, si c'est nul de ne pas vous en dire beaucoup.
Par exemple:
Sera de retour trois types de données et une valeur null. La manipulation de la valeur NULL est une grande partie de SQL. Un grand nombre de personnes, moi y compris, à la fois pour gérer la valeur null à une valeur pour le représenter ou bien à d'autres fois pas de soins. SQL Variante ne FONCTIONNE que pour un peuplé de la valeur avec l'argument: "BaseType', sinon elle renvoie null. Pour autant que je sais que c'est en raison de SQL en disant: "Vous n'avez pas de données ici, rien de déterminer pour l'utilisation de la mémoire."
Généralement je vais préciser isnull(@chose, 0) lorsque l'on travaille avec des entiers ont été, j'ai explicitement voulez un jeu de données pour inclure les zéros pour des inconnus. À d'autres moments, je souhaitera peut-être avoir à l'utilisateur de savoir un nul événement n'ont autre chose isnull(@chose, "non présent") pour un rapport. Encore d'autres moments, vous pouvez utiliser fusionnent pour fondamentalement, un tableau de posibilités fusionnent(@chose, @otherthing, @yetotherthing, "inconnu").
Je pense que dans le code que vous observez quelqu'un est la conversion de quelque chose quand je ne suis pas certain de l'endroit où vous avez vraiment besoin de faire une telle chose. Le type de données d'une colonne dans un tableau de ce qu'il doit être et SQL ne sera pas stocker de la mémoire quand il est NUL. Si le besoin de changement, il semble arbitraire à mon humble avis. Je sais que vous pouvez mieux gérer la consommation de mémoire lorsque vous vous attendez à plus les valeurs null avec la rare option qui a été introduit je crois en SQL 2008. Mais je ne sais pas quand à jeter quelque chose qui consomme à peine de quoi être plus.
De couse NULL a le type de données.
Essayez de code suivant pour confirmer:
Et je pense qu'il y a un bug dans SQL_VARIANT mise en œuvre, car il lossing informations sur le type NULL. Trop mauvais!
Je ne suis pas d'accord avec @aaron-bertrand. Depuis Par défaut de SQl server créé la colonne avec le type de données entier pour stocker la valeur NULL comme valeur Null peut être inséré dans Int, Datetime, Date, type Varchar une autre colonne.
Lors de l'insertion de la valeur Null dans une table avec
SÉLECTIONNEZ x = NULL EN #x;
SQl server créé entier type de colonne par défaut comme valeur Null peut être inséré à la colonne de type Integer.
Donc peut-être que c'est dû à la nature de la requête, nous avons écrit "SELECT x = NULL EN #x;", ce qui rend la colonne sous forme d'entier et de mettre la valeur NULL.