2010-01-20 23 views
6

Theo tài liệu, dữ liệu gốc (nhị phân) có thể được nhập hoặc xuất với bcp được định dạng trong các định dạng dữ liệu SQL Server gốc. Các ví dụ trong số này là SQLFLT8, SQLFLT4, SQLMONEY hoặc SQLNUMERIC.Các định dạng lưu trữ nhị phân cho sqflt8, sqlmoney và các kiểu dữ liệu SQL gốc khác là gì?

Có ai biết định dạng dữ liệu cho các loại khác nhau hay không, hoặc nơi tài liệu chỉ định các định dạng này có thể được tìm thấy. Ví dụ, là một SQLFLT8 được lưu trữ như một số chính xác đôi IEEE hoặc ở một số định dạng khác?

Edit: Từ câu trả lời bằng kevchaddersAndrew tôi đã có một sự hiển linh ít đã làm một chút googling cho #define và typedef để xem nếu tôi có thể tìm thấy các tập tin header C với các định nghĩa. Điều này đã đưa ra một tập tin odbcdss.h; các answer Tôi đã đăng dưới đây có một số out-take từ tập tin, trông khá hứa hẹn.

+0

+1 câu hỏi hay – kevchadders

Trả lời

4

Tôi không chắc chắn nếu lý thuyết sẽ giữ, nhưng việc tìm ra lưu trữ nội bộ của các loại có thể đạt được bằng cách sử dụng một số SQL và một chút để tìm ra. Tôi đã làm điều này cho datetime2/datetimeoffset mới trên blog của tôi để speifically có được định dạng nhị phân nội bộ như tôi đã quan tâm để xem làm thế nào họ có độ chính xác bổ sung.

Như một ví dụ cho tiền

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 

Output: 0x000000000001E208

Đó là 123.400 khi được coi là một số thập phân, tiền được lưu giữ đến 4 chữ số thập phân do đó sẽ chỉ ra 12,3400 như giá trị, đảo ngược này trong lý thuyết giá trị là chỉ 1 trong hex nên 0,0001

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

Đầu ra 0,0001

Điều tiếp theo tôi sau đó sẽ kiểm tra là số âm,

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 

Output: 0xFFFFFFFFFFFE1DF8

Vì vậy mà có vẻ như nó là một ký 8 số byte, vì nó vừa lấy số xa FF ... v.v. Một kiểm tra nhanh với -0.0001 đưa ra tất cả 0xFFF .... FFF như mong đợi và -0.0002 cho 0xFF .... FFE như mong đợi.

Cho dù điều này giữ cho BCP tôi không chắc chắn, nhưng như là một định dạng lưu trữ nội bộ tôi sẽ đoán tại một số nguyên 8 byte có chữ ký có một số 4 chữ số thập phân giả định.

+0

Tài liệu cho bcp có nghĩa là các định dạng 'nguyên gốc' giống như các biểu diễn gốc của dữ liệu trong SQL Server, nhưng không ghi rõ các định dạng. Một số tìm kiếm thêm đã bật lên một tệp tiêu đề C với các định nghĩa kiểu khác nhau tương ứng với các kiểu dữ liệu và trông khá hợp lý. 1 cho (a) suy nghĩ về việc chuyển đổi sang các kiểu dữ liệu nhị phân() trong SQL Server - mà không xảy ra với tôi - và (b) gặp khó khăn trong việc kiểm tra giả thuyết. Câu trả lời tốt. – ConcernedOfTunbridgeWells

+0

Định nghĩa ngày giờ trong tệp đó là chính xác, 4 byte thấp là số không dấu 300 giây trong một giây, tôi đã giải mã được một lần khi tôi đã thực hiện datetime2 để hiển thị sự khác biệt. – Andrew

1

Câu hỏi hay.

Dường như không có gì nhiều trên web về điều này nhưng tôi đã tìm thấy điều này Native File Storage Types (Bảng thứ hai) hiển thị từng loại tệp gốc và loại dữ liệu được ghi trong loại dữ liệu tệp máy chủ tương ứng.

ví dụ: float = SQLFLT8
thực = SQLFLT4
tiền = SQLMONEY
số = SQLNUMERIC

Xin lỗi nếu bạn đã đi qua danh sách này.

+0

Tôi đã thấy điều này và các tài liệu tương tự khác. Mặc dù tài liệu này đôi khi ám chỉ đến nó nhưng nó không thực sự xuất hiện và cho biết đây có phải là các định dạng gốc của máy hay không. Một số googling bổ sung bật lên tập tin tiêu đề c mà tôi đã đặt trong các chỉnh sửa, trong đó có những gì trông rất giống như định nghĩa kiểu cho các loại. Xem bên dưới. – ConcernedOfTunbridgeWells

5

Một số thông tin bổ sung khác cho #define và typedef cùng với các loại dữ liệu đã bật lên tệp tiêu đề này (odbcss.h) được liên kết here.. Dòng đầu tiên có #Defines cho các hằng số ma thuật tương ứng trực tiếp với tên của các kiểu dữ liệu SQL. Đoạn mã dưới có một số kiểu chữ và định nghĩa cấu trúc cho các định dạng dữ liệu tìm kiếm hợp lý cho các loại.

Có vẻ như đây có thể là định nghĩa có định dạng có liên quan.

Các đoạn có liên quan bao gồm:

// 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 
+0

Gkad bạn founs một cái gì đó. +1 – kevchadders

Các vấn đề liên quan