Согласно документации, собственные (двоичные) данные могут быть импортированы или экспортированы с BCP, отформатированной в собственных форматах данных SQL Server. Примерами их является SQLFLT8, SQLFLT4, SQLMONEY или SQLNUMERIC.
Делает любой знает или что форматы данных для различных типов, или где документация, указывающая эти форматы, могла бы быть найдена. Например, SQLFLT8 хранится как число двойной точности IEEE или в некотором другом формате?
Править: Из ответов kevchadders и Andrew I имел немного прозрения, сделал определенный поиск с помощью Google для #define и определение типа, чтобы видеть, мог ли я найти заголовочные файлы C с определениями. Это придумало файл odbcdss.h
; ответ, который я отправил ниже, имеет некоторые купюры из файла, который выглядит довольно многообещающим.
Я не уверен, что теория проведет, но выяснение внутреннего хранения типов может быть достигнута с помощью некоторого SQL и немного выяснения. Я сделал это для нового dateTime2 / dateTimeoffset в моем блоге, чтобы спешифицировать внутренний двоичный формат, поскольку мне было интересно, чтобы увидеть, как они получили дополнительную точность.
В качестве примера для денег
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
вывод: 0x000000000001e208
, который составляет 123400, когда он рассматривается как десятичное число, деньги хранятся в 4 десятичных места, чтобы указать 12.3400 в качестве значения, обращаясь к этому теоретической ценностью Всего 1 в шестнадцатеричном должен быть 0,0001
declare @test money
declare @binaryValue binary(8)
set @binaryvalue = 0x0000000000000001
set @test = convert(money,@binaryvalue)
select @test
Выходы 0,0001
Следующая вещь, которую я бы проверил, это отрицательные числа,
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
Выход: 0xFFFFFFFFFFFE1DF8
Так что выглядит так, как это подписано 8 байтовых номеров, так как Просто убрал номер от FF ... etc. Быстрая чека с -0.0001 выдает все 0xFFF .... FFF, как и ожидалось, и -0.0002 дает 0xFF .... FFE, как и ожидалось.
Если удерживается ли это для BCP, я не уверен, но в качестве внутреннего формата хранения я бы полагаю на подписанном 8 байтовом целочисленном числе, который имеет принятие 4 десятичных знаков.
Некоторые дополнительные густочки для #define и Typedef в сочетании с типовыми типами данных включали этот файл заголовка ( odbcss.h
), связанный здесь . . Первая строка имеет #defines для магических констант, которые соответствуют именам типов данных SQL. Нижний фрагмент имеет некоторые определения типаFS и структуры для разумных форматов видов данных для типов.
Похоже, это могут быть соответствующие определения формата.
Соответствующие фрагменты:
// SQL Server Data Type Tokens. Returned by SQLColAttributes/SQL_CA_SS_COLUMN_SSTYPE.
#define SQLTEXT 0x23
#define SQLVARBINARY 0x25
#define SQLINTN 0x26
#define SQLVARCHAR 0x27
#define SQLBINARY 0x2d
#define SQLIMAGE 0x22
#define SQLCHARACTER 0x2f
#define SQLINT1 0x30
#define SQLBIT 0x32
#define SQLINT2 0x34
#define SQLINT4 0x38
#define SQLMONEY 0x3c
#define SQLDATETIME 0x3d
#define SQLFLT8 0x3e
#define SQLFLTN 0x6d
#define SQLMONEYN 0x6e
#define SQLDATETIMN 0x6f
#define SQLFLT4 0x3b
#define SQLMONEY4 0x7a
#define SQLDATETIM4 0x3a
#define SQLDECIMAL 0x37
#define SQLDECIMALN 0x6a
#define SQLNUMERIC 0x3f
#define SQLNUMERICN 0x6c
[. Отказ Отказ ]
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
Хороший вопрос.
не кажется многое в Интернете об этом, но я нашел этот родные типы хранения файлов (вторая таблица вниз), который показывает каждый тип хранения файлов и что он записан в соответствующих данных файла хоста. тип.
E.g.
float = sqlflt8
Real = SQLFLT4
деньги = sqlmoney
Numeric = SQLNUMERIC
Извинения, если вы уже столкнулись с этим списком.