SQL语句(有难度。回答测试通过在送1000分)(300分)

  • 主题发起人 主题发起人 网中戏
  • 开始时间 开始时间

网中戏

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思还是错误。只是显示了27位数字。但是把后面的数字变0了。
原帖http://www.delphibbs.com/delphibbs/dispq.asp?lid=3621755
问题如下
表A是一个记事本文件 .里有如下内容
B
001001177979420061001075740
001001526032220061001074235
001001177979420061001162749
001001526032220061001161304
001001178165520061001155739
保存在c:/a.txt
*****************************
用下面语句
select B from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=c:/;','select * from A.txt')

查询后得到
1.001177979420061E+24
1.001526032220061E+24
1.001177979420061E+24
1.001526032220061E+24
1.001178165520061E+24
///////////////////////////////////
大家把上面内容复制到c:/a.txt中

用查询分析器执行上面的语句就可以看到
 
执行
select substring(B,0,27) from
OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=c:/;','select * from A.txt')
错误提示为:
数据类型 float 对于函数 substring 无效。允许的类型为: char/varchar、nchar/nvarchar 和 binary/varbinary。
所以我觉得数据在取出来时就已经用科学记数取出来了,所以关键在于怎么取数据
 
在c:/建立一个文本文件,命名为 Schema.ini
内容为:
[a.txt]
ColNameHeader=True
Format=FixedLength
FixedFormat= RaggedEdge
MaxScanRows=25
CharacterSet=OEM
Col1=b Char Width 27

然后再执行相同的SQL语句就能得出你需要的结果
这是使用Microsoft Text Driver需要的描述文件
 
To
轻舞肥羊
大侠乃高手也。但是每次不知道A.txt客户保存在那里(不一定在c:/)。也不一定用A保存(可能是B.txt 或 ??.txt );
有没有办法用语句实现?请赐教
使用Microsoft Text Driver需要的描述文件如何放在语句中
 
因为这是文本驱动,所以描述文件和数据文件是独立的,也不能在SQL语句中指定格式信息.文本驱动支持的SQL好象就一句SELECT,也不能实现复杂点的查询.
如果真的无法知道保存在哪,文件名是什么,那这个问题可能没法解决了
 
to :轻舞肥羊
如果内容是这样
B
a
b
c
d
e
f
g
001001177979420061001075740
001001526032220061001074235
001001177979420061001162749
001001526032220061001161304
001001178165520061001155739
……
读出就正常。前面乱加几句驱动就自动正常了。应该可以解决的。帮个忙呀
 
老大一项是1000分的问题 呵呵
学习
 
Microsoft Text Driver 如果没有找到描述文件,会自动识别字段的数据类型.而这个过程没有文档可查,可以说"前面乱加几句驱动就自动正常了"是没有正确的理论支持的,我看是没法从中寻找规律的.
 
那是sqlengine的问题,它会根据你的数据前6行(或是8行,这个可以设置),来判断你的数据类型.
如果是sqlserver2005应该可以解决吧,记得有个bulk opinoin.

在2000里面,可以尝试用格式化文件导入倒临时表,在查询.
 
To
轻舞肥羊

大侠能否解释一下Schema.ini中那几个参数是什么意思吗?小的驽钝 [:D][:D]
 
帮顶,出手这么阔气
我也接下分[:D]呵呵。。。
 
to 轻舞肥羊
高手,有时间写写这样的笔记给我们学习学习:)
敬礼!
 
http://www.chinaaspx.com/archive/database/16323.htm
导入文本文件时如何指定字段类型?





问题:



我有一个文本文件需要导入 Access ,但是文本文件中有一列数据原本是文本,但是导入数据库后自动变成了“双精度”类型,我该如何让各个字段按我需要的数据类型生成哪?
如何让 ACCESS 按照我规定的构架、规格从文本文件、XLS文档中导入数据?




方法二:



用 Schema.ini 文件也可以达到要求。

作用:Schema.ini用于提供文本文件中记录的构架信息。每个 Schema.ini 项都用于指定表的五个特征之一:
1、文本文件名
2、文件格式
3、字段名、字段长度、字段类型
4、字符集
5、特别数据类型转换


指定文件名
文件名要用方括号括起来,例如如果要对 Sample.txt 使用数据构架信息文件,那么它的对应的项应该是
[Sample.txt]




指定文件格式
格式说明 表格式 Schema.ini 格式描述
Tab 制表符分隔 文件中的字段用制表符分隔 Format=TabDelimited
CSV 分隔 文件中的字段用逗号来分隔 Format=CSVDelimited
自定义分隔 文件中的字段可以用任何字符来分隔,所有的字符都可以用来分隔,包括空格,但是双引号 ( " ) 除外 Format=Delimited(自定义分隔符)

- 或者没有分隔符 -

Format=Delimited( )

固定宽度 文件中的字段为固定长度



指定字段

你可以有两种方法在一个字符分隔的文本文件中指定字段名

1、在文本文件中的第一行包含字段名,并且设置 ColNameHeader 为 True 。
2、用数字编号指定每一列并且指定每一列的名字以及数据类型

你必须用数字编号指定每一列并且指定每一列的名字、数据类型以及长度(在固定长度分隔的文本文件中需要指定长度)

注意,设定了 ColNameHeader 选项,在 Schema.ini 中 Windows 注册时会忽略 FirstRowHasNames 选项。

你也可以指定字段的数据类型,使用 MaxScanRows 选项用来指定在确定列的数据类型时要扫描多少行数据。设置 MaxScanRows 为 0 将扫描整个文件。

如果文本文件第一行包含字段名,并且要扫描整个文件,改项目就要定义如下:
ColNameHeader=True
MaxScanRows=0



接下来的项目用来指定表中的字段,使用列编号(Coln)选项来指定列。字段长度在“固定分隔文本文件中”是必填项目,在“字符分隔文本文件”中是可选项目。
示例:定义 2 个字段,CustomerNumber 是长度为 10 的文本字段、CustomerName 是长度为 30 的文本字段。
Col1=CustomerNumber Text Width 10
Col2=CustomerName Text Width 30



语法如下:
Coln=ColumnName type [Width #]

参数解释如下:
参数 说明
ColumnName 文本,标识字段名,如果包含空格要用双引号括起来
type 数据类型包括:

Microsoft Jet 数据类型:Bit Byte Short Long Currency Single Double DateTime Text Memo

ODBC 数据类型: Char (same as Text) Float (same as Double) Integer (same as Short) LongChar (same as Memo) Date date format

其中date format 是日期的格式字符串例如:Date YYYY-MM-DD

Width 字符串的长度,后面的数字用来指定字段的长度(“固定分隔文本文件”为必填,“文字分隔文本文件”为可选)
# 整形数字,标识字段长度


指定字符集
CharacterSet 项有两个选择:ANSI | OEM
选择 ANSI 字符集用如下方法:
CharacterSet=ANSI




特别数据类型转换
特别数据类型转换主要是定义比如日期、货币型数据如何转换或者如何显示的,你可以参考下面这张表:
选项 说明
DateTimeFormat
Can be set to a format string indicating dates and times. You should specify this entry if all date/time fields in the import/export are handled with the same format. All Microsoft Jet formats except A.M. and P.M. are supported. In the absence of a format string, the Windows Control Panel short date picture and time options are used.

DecimalSymbol
Can be set to any single character that is used to separate the integer from the fractional part of a number.

NumberDigits
Indicates the number of decimal digits in the fractional portion of a number.

NumberLeadingZeros
Specifies whether a decimal value less than 1 and greater than –1 should contain leading zeros; this value can either be False (no leading zeros) or True.
CurrencySymbol
Indicates the currency symbol to be used for currency values in the text file. Examples include the dollar sign ($) and Dm.

CurrencyPosFormat
Can be set to any of the following values:
· Currency symbol prefix with no separation ($1)

· Currency symbol suffix with no separation (1$)

· Currency symbol prefix with one character separation ($ 1)

· Currency symbol suffix with one character separation (1 $)


CurrencyDigits
Specifies the number of digits used for the fractional part of a currency amount.

CurrencyNegFormat
Can be one of the following values:
· ($1)

· –$1

· $–1

· $1–

· (1$)

· –1$

· 1–$

· 1$–

· –1 $

· –$ 1

· 1 $–

· $ 1–

· $ –1

· 1– $

· ($ 1)

· (1 $)

This example shows the dollar sign, but you should replace it with the appropriate CurrencySymbol value in the actual program.


CurrencyThousandSymbol
Indicates the single-character symbol to be used for separating currency values in the text file by thousands.

CurrencyDecimalSymbol
Can be set to any single character that is used to separate the whole from the fractional part of a currency amount.


 


下面给出一个简单的例子,假设有一个表Contacts.txt类似下面:
姓名 单位 联系日期
王海 上海有机化学研究所 2002-1-1
罗炙 数字化机床研究院 2004-1-1



导入 Access 应该类似下面表格:
姓名 单位 联系日期
王海 上海有机化学研究所 2002-1-1
罗炙 数字化机床研究院 2004-1-1



那么 Schema.ini 则是类似下面的INI文件:
[Contacts.txt]
ColNameHeader=True
format=Delimited(" ")
MaxScanRows=0
CharacterSet=ANSI
Col1="姓名" Char Width 10
Col2="单位" Char Width 9
Col3="联系日期" Date Width 8



注释如下:
[Contacts.txt] ///文本文件名
ColNameHeader=True ///带有表头
format=Delimited( ) ///空格作为分隔符,如果是分号,请用format=Delimited(;) 来解决
MaxScanRows=0 ///扫描整个文件
CharacterSet=ANSI ///ANSI 字符集
Col1="姓名" Char Width 10 ///字段1
Col2="单位" Char Width 9 ///字段2
Col3="联系日期" Date Width 8 ///字段3
///如果有更多字段可 Col4 .... ColN



注意,Schema.ini 必须和需要导入的文本文件在同一目录。

此后,我们就可以利用下面的语句来导入数据了:

CurrentProject.Connection.Execute "SELECT * INTO NewContact FROM [Text;FMT=Delimited;HDR=Yes;DATABASE=C:/;].[Contacts#txt];"



注意,到 2000 格式的 MDB 为止,以下语句都会导致导入失败,应该是 Access 本身的问题:
到 Access XP / access 2003 出现不知道是否已经解决该问题,大家可以在“评论”中告诉我测试结果。
DoCmd.TransferText acImportFixed, , "Contacts", "C:/contacts.txt"

或者
DoCmd.TransferText acImportFixed, "C:/.ini", "Contacts", "C:/Documents.txt"


错误消息为:

运行时错误 '3625':
文本文件规范 'c:schema.ini' 不存在。不能使用规范进行导入、导出或者链接。
或者
运行时错误 '2511':
这个操作或方法需要一个 Specification Name 参数。

另外,请参考:
http://support.microsoft.com/default.aspx?scid=kb;en-us;241477
 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetschema_ini_file.asp

写一个Schema文件进去,
 
晕,有人解答过了
你在选路径时,检查下是否有Schema文件,没有的话根据文本文件的名字创建一个出来就好了啊
 
Schema?????
 
把 a.txt 改成下面内容即可:
B
"001001177979420061001075740"
"001001526032220061001074235"
"001001177979420061001162749"
"001001526032220061001161304"
"001001178165520061001155739"
 
不优化了。用原来的吧。越优化越复杂了[:D]
 
后退
顶部