8
votes

Quels sont les formats de stockage binaire pour SQFLT8, SQLMMoney et d'autres types de données SQL natifs?

Selon la documentation, les données natives (binaires) peuvent être importées ou exportées avec BCP formaté dans les formats de données SQL Server natifs. Des exemples de ceux-ci sont SQLFLT8, SQLFLT4, SQLMMoney ou SQLNumeric.

Est-ce que quelqu'un sache soit que les formats de données pour les différents types sont ou lorsque la documentation spécifiant ces formats pourrait être trouvée. Par exemple, une SQLFLT8 est-elle stockée comme un numéro de double précision IEEE ou dans un autre format?

edit: des réponses par Kevchadders et Andrew J'avais une petite épiphanie faisait un peu de google pour #define et typé à voir si je pouvais trouver c Fichiers d'en-tête avec définitions. Ceci est venu avec un fichier odbcds.h ; Le Réponse que j'ai affiché ci-dessous a une certaine prête du dossier, qui semble très prometteuse.


0 commentaires

3 Réponses :


1
votes

bonne question.

ne semble pas beaucoup sur le Web à ce sujet, mais j'ai trouvé ce Types de stockage de fichiers (deuxième table vers le bas) qui affiche chaque type de stockage de fichiers natifs et ce qu'il est enregistré dans le type de données de fichier d'hôte correspondant.

E.g. Float = SQLFLT8
Real = SQLFLT4
Money = Sqlmoney
numérique = sqlnumeric

excuses si vous avez déjà rencontré cette liste.


1 commentaires

J'ai déjà vu cela et d'autres documents similaires. Bien que ce matériau vous évite parfois, cela ne sort pas vraiment et indiquez s'il s'agit de formats natifs de la machine. Certains googling supplémentaires ont tourné le fichier d'en-tête C que j'ai mis dans les modifications, qui a ce qui ressemble beaucoup à des définitions de type pour les types. Voir ci-dessous.



5
votes

Je ne sais pas si la théorie détiendra, mais que le stockage interne des types peut être atteint en utilisant certains SQL et un peu de déterminer. Je l'ai fait pour le nouveau DateTime2 / DateTimeOffset sur mon blog pour obtenir de manière expressiquement le format binaire interne, car je voulais voir comment ils ont obtenu la précision supplémentaire.

Un exemple d'argent P>

declare @test money
set @test = -12.34
select @test -- shows -12.34 as expected

declare @binaryValue binary(8)
set @binaryvalue = convert(binary(8),@test)
select @binaryvalue 


2 commentaires

La documentation pour le BCP implique que les formats «natifs» sont identiques à représentations indigènes des données dans SQL Server, mais ne document pas explicitement les formats. Une recherche supplémentaire de recherche d'un fichier d'en-tête C avec différentes définitions de type correspondant aux types de données et d'avoir l'air assez judicieuse. +1 pour (a) penser à faire la conversion en types de données binaires () dans SQL Server - qui ne se sont pas rencontrés à moi - et (b) en avoir la peine de tester l'hypothèse. Bonne réponse.


La définition DateTime dans ce fichier est correcte, les 4 octets inférieurs sont le nombre non signé de 300ths d'une seconde, j'ai décodé celui-là aussi lorsque je l'ai fait DateTime2 pour montrer la différence.



6
votes

Quelques autres Googling pour #define et Typedef en conjonction avec les types de données ont été transférés ce fichier d'en-tête ( odbcss.h code>) lié ICI. . La première ligne a #defines pour des constantes magiques qui correspondent directement aux noms des types de données SQL. L'extrait inférieur contient des définitions de typeFS et de struct pour les formats de données à la recherche raisonnables pour les types.

On dirait que celles-ci pourrait être les définitions de format correspondantes. P>

Les extraits correspondants sont les suivants: P>

typedef char            DBCHAR;
typedef unsigned char   DBBINARY;
typedef unsigned char   DBTINYINT;
typedef short           DBSMALLINT;
typedef unsigned short  DBUSMALLINT;
typedef long            DBINT;
typedef double          DBFLT8;
typedef unsigned char   DBBIT;
typedef unsigned char   DBBOOL;
typedef float           DBFLT4;

typedef DBFLT4 DBREAL;
typedef UINT   DBUBOOL;

typedef struct dbvarychar
{
    DBSMALLINT  len;
    DBCHAR      str[DBMAXCHAR];
} DBVARYCHAR;

typedef struct dbvarybin
{
    DBSMALLINT  len;
    BYTE        array[DBMAXCHAR];
} DBVARYBIN;

typedef struct dbmoney
{               // Internal representation of MONEY data type
    LONG  mnyhigh;      // Money value *10,000 (High 32 bits/signed)
    ULONG mnylow;       // Money value *10,000 (Low 32 bits/unsigned)
} DBMONEY;

typedef struct dbdatetime
{               // Internal representation of DATETIME data type
    LONG  dtdays;       // No of days since Jan-1-1900 (maybe negative)
    ULONG dttime;       // No. of 300 hundredths of a second since midnight
} DBDATETIME;

typedef struct dbdatetime4
{           // Internal representation of SMALLDATETIME data type
    USHORT numdays;     // No of days since Jan-1-1900
    USHORT nummins;     // No. of minutes since midnight
} DBDATETIM4;

typedef LONG DBMONEY4;  // Internal representation of SMALLMONEY data type
                        // Money value *10,000

#define DBNUM_PREC_TYPE BYTE
#define DBNUM_SCALE_TYPE BYTE
#define DBNUM_VAL_TYPE BYTE
typedef const LPBYTE    LPCBYTE;
typedef DBINT *         LPDBINT;

#if (ODBCVER < 0x0300)
#define MAXNUMERICLEN 16

typedef struct dbnumeric
{                 // Internal representation of NUMERIC data type
    DBNUM_PREC_TYPE   precision; // Precision
    DBNUM_SCALE_TYPE  scale;     // Scale
    BYTE     sign;           // Sign (1 if positive, 0 if negative)
    DBNUM_VAL_TYPE    val[MAXNUMERICLEN];   // Value
} DBNUMERIC;
typedef DBNUMERIC DBDECIMAL;// Internal representation of DECIMAL data type
#else   //  Use ODBC 3.0 definitions since same as DBLib
#define MAXNUMERICLEN SQL_MAX_NUMERIC_LEN
typedef SQL_NUMERIC_STRUCT DBNUMERIC;
typedef SQL_NUMERIC_STRUCT DBDECIMAL;
#endif

#endif //   MAXNUMERICLEN


0 commentaires