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. P>
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? P>
edit: strong> 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 code>; Le Réponse que j'ai affiché ci-dessous a une certaine prête du dossier, qui semble très prometteuse. P>
3 Réponses :
bonne question. p>
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. P>
E.g.
Float = SQLFLT8
Real = SQLFLT4
Money = Sqlmoney
numérique = sqlnumeric p>
excuses si vous avez déjà rencontré cette liste. P>
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.
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
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.
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 ( On dirait que celles-ci pourrait être les définitions de format correspondantes. P> Les extraits correspondants sont les suivants: P> 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.
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