根据该文件,司机(二)数据可以进口或出口与bcp格式的本机SQL服务器的数据格式。这方面的例子是SQLFLT8,SQLFLT4,SQLMONEY或SQLNUMERIC.

任何人都不会知道无论是什么样的数据格式,用于各种类型,或者在文件中指定这些格式可能会被发现。例如,是一个SQLFLT8存储如IEEE双精确数量或在某些其他格式?

编辑: 从答复 kevchadders安德鲁 我有点顿悟了一点小小的搜索对#定义和typedef看如果我能找到C头的文件定义。这带来了一个文件 odbcdss.h;的 答案 我已经发布以下一些出需要的文件,该文件看起来很有希望的。

有帮助吗?

解决方案

我不知道,如果理论将举行,但查不到类型的内部存储可以使用一些SQL和一点搞清楚的实现。我这样做是为了在我的博客新的DATETIME2 / DATETIMEOFFSET到speifically得到内部二进制格式,我很感兴趣,看看他们是如何得到额外的精度。

作为货币的示例

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 ...等了。快速检查与-0.0001给出了所有0xFFF的.... FFF如预期和-0.0002给出为0xFF ....按预期FFE。

这是否适用于BCP我不知道,但作为内部存储格式我将在签署8个字节的整数已经假定小数点后4位取一个猜测。

其他提示

一些进一步的搜索对#定义和typedef结合的数据类型了这一标题的文件(odbcss.h)链接 在这里。.第一线#定义为魔法的常量直接对应的名称,SQL数据类型。下段有一些typefs和结构定义为合理的查找数据格式为的类型。

它看起来像这样的可能是相关的格式定义。

相关段是:

// 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。 浮= SQLFLT8结果 真正= SQLFLT4结果 钱= SQLMONEY结果 数字= SQLNUMERIC

道歉,如果你已经碰到过这样的名单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top