select top 1 SQL_VARIANT_PROPERTY(列1),SQL_VARIANT_PROPERTY(列2),SQL_VARIANT_PROPERTY(列3) from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from [aa.DBF]')
to pengdali(大力 V3.0) : SQL_VARIANT_PROPERTY 的参数好象不够,系统提示sql_variant_property 函数要求有 2 个参数。 还有,如果我在不知道表中字段名的情况下该怎样获取表的字段名、类型以及长度
--那就可以用下面的这个:--根据Dbase表生成临时表 select * into #tb from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase IV;DATABASE=C:\','select * from [地区资料.dbf] where 1=2')--根据临时表查询表结构 SELECT 字段序号=a.colorder, 字段名=a.name, 标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end, 类型=b.name, 占用字节数=a.length, 长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'), 小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0), 允许空=case when a.isnullable=1 then '√'else '' end FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where object_id('tempdb..#tb')=id order by a.id,a.colorder--完成后删除临时表 drop table #tb
对不起少写了:select top 1 SQL_VARIANT_PROPERTY(列1,'BaseType'),SQL_VARIANT_PROPERTY(列2,'BaseType'),SQL_VARIANT_PROPERTY(列3,'BaseType') from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from [aa.DBF]')
什么都不知道的话: select * into 中间表 from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from [aa.DBF]')select a.name 列名,b.name 类型,a.length 长度, a.isnullable 是否为空 from syscolumns a, systypes b,sysobjects d where a.xtype=b.xusertype and a.id=d.id and d.xtype='U' and d.name='中间表'drop table 中间表
to zjcxc(邹建) 、pengdali(大力 V3.0) : 谢谢两位,我也想过用中间表或临时表,可是将 DBF 数据库导入到 SQL SERVER 的时候有些类型会出错,比如 DATETIME 类型。所以我想在导入之前就先获得字段的类型,然后通过DTS 编程将DATETIME 转成 VARCHAR。不知道两位有没有更好的方法让我在数据导入之前就能获得字段的类型及长度。谢谢!
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
SQL_VARIANT_PROPERTY 的参数好象不够,系统提示sql_variant_property 函数要求有 2 个参数。
还有,如果我在不知道表中字段名的情况下该怎样获取表的字段名、类型以及长度
[ , [ @table_name = ] 'table_name' ]
[ , [ @table_schema = ] 'table_schema' ]
[ , [ @table_catalog = ] 'table_catalog' ]
[ , [ @column_name = ] 'column' ]
[ , [ @ODBCVer = ] 'ODBCVer' ]
示例
下面的示例返回 titles 表的 title_id 列的数据类型。USE master
EXEC sp_columns_ex 'LONDON1', 'titles', 'dbo', 'pubs',
'title_id'
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;DATABASE=C:\','select * from [地区资料.dbf]')
返回有关 sql_variant 值的基本数据类型和其它信息。语法
SQL_VARIANT_PROPERTY ( expression, property ) 参数
expression
是 sql_variant 类型的表达式。property
包含将为其提供信息的 sql_variant 属性名称。property 是 varchar(128),可以是下列任何值。
值 描述 返回的 sql_variant 基本类型
BaseType SQL Server 数据类型,如:
char
int
money
nchar
ntext
numeric
nvarchar
real
smalldatetime
smallint
smallmoney
text
timestamp
tinyint
uniqueidentifier
varbinary
varchar
sysname
无效的输入 = NULL
Precision 数字基本数据类型的位数:
datetime = 23
smalldatetime = 16
float = 53
real = 24
decimal (p,s) and numeric (p,s) = p
money = 19
smallmoney = 10
int = 10
smallint = 5
tinyint = 3
bit = 1
all other types = 0
int
无效的输入 = NULL
Scale 数字基本数据类型小数点右边的位数:
decimal (p,s) 和 numeric (p,s) = s
money 和 smallmoney = 4
datetime = 3
所有其它类型 = 0
int
无效的输入 = NULL
TotalBytes 要包含值的元数据和数据所需的字节数。该信息在检查 sql_variant 列中数据的最大一侧时很有用。如果该值大于 900,索引创建将失败。 int
无效的输入 = NULL
Collation 代表特定 sql_variant 值的排序规则。 sysname
无效的输入 = NULL
MaxLength 最大数据类型长度(以字节为单位)。例如,nvarchar(50) 的 MaxLength 是 100,int 的 MaxLength 是 4。 int
无效的输入 = NULL
如果我在不知道表中字段名的情况下该怎样获取表的字段名、类型以及长度
select * into #tb from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;DATABASE=C:\','select * from [地区资料.dbf] where 1=2')--根据临时表查询表结构
SELECT 字段序号=a.colorder,
字段名=a.name,
标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
允许空=case when a.isnullable=1 then '√'else '' end
FROM tempdb..syscolumns a
left join tempdb..systypes b on a.xtype=b.xusertype
where object_id('tempdb..#tb')=id
order by a.id,a.colorder--完成后删除临时表
drop table #tb
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * into 中间表 from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')select a.name 列名,b.name 类型,a.length 长度, a.isnullable 是否为空 from syscolumns a, systypes b,sysobjects d where a.xtype=b.xusertype and a.id=d.id and d.xtype='U' and d.name='中间表'drop table 中间表
谢谢两位,我也想过用中间表或临时表,可是将 DBF 数据库导入到 SQL SERVER 的时候有些类型会出错,比如 DATETIME 类型。所以我想在导入之前就先获得字段的类型,然后通过DTS 编程将DATETIME 转成 VARCHAR。不知道两位有没有更好的方法让我在数据导入之前就能获得字段的类型及长度。谢谢!