8

ドキュメントによると、ネイティブ(バイナリ)データは、ネイティブSQLServerデータ形式でフォーマットされたbcpを使用してインポートまたはエクスポートできます。これらの例は、SQLFLT8、SQLFLT4、SQLMONEY、またはSQLNUMERICです。

さまざまなタイプのデータ形式が何であるか、またはこれらの形式を指定するドキュメントがどこにあるかを知っている人はいますか。たとえば、SQLFLT8はIEEE倍精度数として、またはその他の形式で保存されていますか?

編集:kevchaddersAndrewの回答から、定義付きのCヘッダーファイルが見つかるかどうかを確認するために、#defineとtypedefを少し調べてみました。これはファイルを思いついたodbcdss.h; 私が以下に投稿した回答には、ファイルからのいくつかのアウトテイクがあり、非常に有望に見えます。

4

3 に答える 3

6

データ型と組み合わせて#defineとtypedefをさらにグーグルすると、ここにodbcss.hリンクされているこのヘッダーファイル()が見つかりました。。最初の行には、SQLデータ型の名前に直接対応するマジック定数の#Definesがあります。下のスニペットには、タイプの適切なデータ形式のtypefsとstruct定義がいくつかあります。

これらが関連するフォーマット定義である可能性があるようです。

関連するスニペットは次のとおりです。

// 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
于 2010-01-20T10:32:25.510 に答える
5

理論が成り立つかどうかはわかりませんが、型の内部ストレージを見つけるには、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

つまり、10進数と見なすと123400であり、お金は小数点以下4桁に格納されるため、値として12.3400を示します。これを逆にすると、理論的には、16進数で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

FFから番号を取り除いただけなので、署名された8バイトの番号のように見えます...など。-0.0001を使用したクイックチェックでは、すべての0xFFF .... FFFが期待どおりに出力され、-0.0002で0xFF....FFEが期待どおりに出力されます。

これがBCPに当てはまるかどうかはわかりませんが、内部ストレージ形式として、小数点以下4桁を想定した符号付き8バイト整数を推測します。

于 2010-01-20T09:33:42.043 に答える
1

良い質問。

これについてはWeb上ではあまり見かけませんが、このネイティブファイルストレージタイプ(下の2番目の表)を見つけました。これは、各ネイティブファイルストレージタイプと、対応するホストファイルデータタイプに記録されているものを示しています。

例:float=SQLFLT8
実数=SQLFLT4
お金=SQLMONEY
数値=SQLNUMERIC

すでにこのリストに出くわした場合は、お詫び申し上げます。

于 2010-01-20T09:00:49.267 に答える