列出SQL SERVER 所有表,字段名,主键,类型,长度,小数位数等信息

列出SQL SERVER 所有表,字段名,主键,类型,长度,小数位数等信息

 

[转]

 

 

-- ======================================================

--在查询分析器里运行即可,可以生成一个表,导出到EXCEL中

-- ======================================================

SELECT

       (case when a.colorder=1 then d.name else '' end)表名,

       a.colorder 字段序号,

       a.name 字段名,

       (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) 标识,

       (case when (SELECT count(*)

       FROM sysobjects

       WHERE (name in

                 (SELECT name

                FROM sysindexes

                WHERE (id = a.id) AND (indid in

                          (SELECT indid

                         FROM sysindexkeys

                         WHERE (id = a.id) AND (colid in

                                   (SELECT colid

                                  FROM syscolumns

                                  WHERE (id = a.id) AND (name = a.name))))))) AND

              (xtype = 'PK'))>0 then '√' else '' end) 主键,

       b.name 类型,

       a.length 占用字节数,

       COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,

       isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,

       (case when a.isnullable=1 then '√'else '' end) 允许空,

       isnull(e.text,'') 默认值,

       isnull(g.[value],'') AS 字段说明   


FROM  syscolumns  a left join systypes b

on  a.xtype=b.xusertype

inner join sysobjects d

on a.id=d.id  and  d.xtype='U' and  d.name<>'dtproperties'

left join syscomments e

on a.cdefault=e.id

left join sysproperties g

on a.id=g.id AND a.colid = g.smallid 

order by a.id,a.colorder

-------------------------------------------------------------------------------------------------

 

 

 

列出SQL SERVER 所有表、字段定义,类型,长度,一个值等信息

并导出到Excel 中

-- ======================================================

-- Export all user tables definition and one sample value

-- jan-13-2003,Dr.Zhang

-- ======================================================

在查询分析器里运行:

SET ANSI_NULLS OFF

GO

SET NOCOUNT ON

GO


SET LANGUAGE 'Simplified Chinese'

go

DECLARE @tbl nvarchar(200),@fld nvarchar(200),@sql nvarchar(4000),@maxlen int,@sample nvarchar(40)


SELECT d.name TableName,a.name FieldName,b.name TypeName,a.length Length,a.isnullable IS_NULL INTO #t

FROM  syscolumns  a,  systypes b,sysobjects d 

WHERE  a.xtype=b.xusertype  and  a.id=d.id  and  d.xtype='U'


DECLARE read_cursor CURSOR

FOR SELECT TableName,FieldName FROM #t


SELECT TOP 1 '_TableName                     ' TableName,

            'FieldName                      ' FieldName,'TypeName             ' TypeName,

            'Length' Length,'IS_NULL' IS_NULL,

            'MaxLenUsed' AS MaxLenUsed,'Sample Value          ' Sample,

             'Comment   ' Comment INTO #tc FROM #t


OPEN read_cursor


FETCH NEXT FROM read_cursor INTO @tbl,@fld

WHILE (@@fetch_status <> -1)  --- failes

BEGIN

       IF (@@fetch_status <> -2) -- Missing

       BEGIN

              SET @sql=N'SET @maxlen=(SELECT max(len(cast('+@fld+' as nvarchar))) FROM '+@tbl+')'

              --PRINT @sql

              EXEC SP_EXECUTESQL @sql,N'@maxlen int OUTPUT',@maxlen OUTPUT

              --print @maxlen

              SET @sql=N'SET @sample=(SELECT TOP 1 cast('+@fld+' as nvarchar) FROM '+@tbl+' WHERE len(cast('+@fld+' as nvarchar))='+convert(nvarchar(5),@maxlen)+')'

              EXEC SP_EXECUTESQL @sql,N'@sample varchar(30) OUTPUT',@sample OUTPUT

              --for quickly  

              --SET @sql=N'SET @sample=convert(varchar(20),(SELECT TOP 1 '+@fld+' FROM '+

                     --@tbl+' order by 1 desc ))' 

              PRINT @sql

              print @sample

              print @tbl

              EXEC SP_EXECUTESQL @sql,N'@sample nvarchar(30) OUTPUT',@sample OUTPUT

              INSERT INTO #tc SELECT *,ltrim(ISNULL(@maxlen,0)) as MaxLenUsed,

                     convert(nchar(20),ltrim(ISNULL(@sample,' '))) as Sample,' ' Comment FROM #t where TableName=@tbl and FieldName=@fld

       END

       FETCH NEXT FROM read_cursor INTO @tbl,@fld

END


CLOSE read_cursor

DEALLOCATE read_cursor

GO


SET ANSI_NULLS ON

GO

SET NOCOUNT OFF

GO

select count(*)  from #t

DROP TABLE #t

GO


select count(*)-1  from #tc


select * into ##tx from #tc order by tablename

DROP TABLE #tc


--select * from ##tx


declare @db nvarchar(60),@sql nvarchar(3000)

set @db=db_name()

--请修改用户名和口令 导出到Excel 中

set @sql='exec master.dbo.xp_cmdshell ''bcp ..dbo.##tx out c:/'+@db+'_exp.xls -w -C936 -Usa -Psa '''

print @sql

exec(@sql)

GO

DROP TABLE ##tx

GO

 


-- ======================================================

--根据表中数据生成insert语句的存储过程

--建立存储过程,执行 spGenInsertSQL 表名

--感谢playyuer

-- ======================================================

CREATE   proc spGenInsertSQL (@tablename varchar(256))


as

begin

  declare @sql varchar(8000)

  declare @sqlValues varchar(8000)

  set @sql =' ('

  set @sqlValues = 'values (''+'

  select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],'

    from

        (select case

                  when xtype in (48,52,56,59,60,62,104,106,108,122,127)                               

                       then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end'

                  when xtype in (58,61)

                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'

                 when xtype in (167)

                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'

                  when xtype in (231)

                       then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'

                  when xtype in (175)

                       then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'

                  when xtype in (239)

                       then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'

                  else '''NULL'''

                end as Cols,name

           from syscolumns 

          where id = object_id(@tablename)

        ) T

  set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablename

  --print @sql

  exec (@sql)

end


GO

 


-- ======================================================

--根据表中数据生成insert语句的存储过程

--建立存储过程,执行 proc_insert 表名

--感谢Sky_blue

-- ======================================================


CREATE proc proc_insert (@tablename varchar(256))

as

begin

       set nocount on

       declare @sqlstr varchar(4000)

       declare @sqlstr1 varchar(4000)

       declare @sqlstr2 varchar(4000)

       select @sqlstr='select ''insert '+@tablename

       select @sqlstr1=''

       select @sqlstr2=' ('

       select @sqlstr1= ' values ( ''+'

       select @sqlstr1=@sqlstr1+col+'+'',''+' ,@sqlstr2=@sqlstr2+name +',' from (select case

--     when a.xtype =173 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'

       when a.xtype =104 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(1),'+a.name +')'+' end'

       when a.xtype =175 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'

       when a.xtype =61  then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'

       when a.xtype =106 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'

       when a.xtype =62  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'

       when a.xtype =56  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(11),'+a.name +')'+' end'

       when a.xtype =60  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'

       when a.xtype =239 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'

       when a.xtype =108 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'

       when a.xtype =231 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'

       when a.xtype =59  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'

       when a.xtype =58  then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'

       when a.xtype =52  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(12),'+a.name +')'+' end'

       when a.xtype =122 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'

       when a.xtype =48  then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(6),'+a.name +')'+' end'

--     when a.xtype =165 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'

       when a.xtype =167 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'

       else '''NULL'''

       end as col,a.colid,a.name

       from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and  a.xtype <>36

       )t order by colid

      

       select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from '+@tablename

--  print @sqlstr

       exec( @sqlstr)

       set nocount off

end

GO

==========================================
********* 利用数据库复制技术 实现数据同步更新 *********

复制的概念

Microsoft? SQL Server? 2000 的复制是在数据库之间对数据和数据库对象进行复制
和分发并进行同步以确保其一致性的一组技术。

使用复制可以将数据分发到不同位置,通过局域网、使用拨号连接、通过 Internet 分
发给远程或移动用户。复制还能够使用户提高应用程序性能,根据数据的使用方式物理
分隔数据(例如,将联机事务处理 (OLTP) 和决策支持系统分开),或者跨越多个服务
器分布数据库处理。


---------------------------------------------------------------------------
SQL复制的基本元素包括

发布服务器、订阅服务器、分发服务器、发布、项目

发布服务器
发布服务器是提供数据以便复制到其它服务器的服务器。发布服务器可以具有一个或多个
发布,每个发布代表一组逻辑相关的数据。除了指定其中哪些数据需要复制之外,发布服
务器还检测事务复制期间发生更改的数据并维护有关此站点上所有发布的信息。

分发服务器
分发服务器是作为分发数据库宿主并存储历史数据和/或事务以及元数据的服务器。分发
服务器的角色根据执行的复制类型而不同。有关更多信息,请参见复制类型。
远程分发服务器是独立于发布服务器并配置为复制的分发服务器的服务器。本地分发服务
器是既配置为复制的发布服务器又配置为复制的分发服务器的服务器。

订阅服务器
订阅服务器是接收复制数据的服务器。订阅服务器订阅的是发布而不是发布中分离的项目;
并且订阅服务器只订阅其需要的发布,而不是发布服务器上所有可用的发布。根据复制的类
型和所选择的复制选项,订阅服务器还可以将数据更改传播回发布服务器或将数据重新发布
到其它订阅服务器。

发布
发布是一个数据库中的一个或多个项目的集合。这种多个项目的分组使得指定逻辑相关的一
组数据和数据库对象以一起复制变得更容易。

项目
项目是指定要复制的数据表、数据分区或数据库对象。项目可以是完整的表、某几列(使用垂
直筛选)、某几行(使用水平筛选)、存储过程或视图定义、存储过程的执行、视图、索引视图
或用户定义函数。

订阅
订阅是对数据或数据库对象的复本的请求。订阅定义将接收的发布和接收的时间、地点。订阅的
同步或数据分发可以由发布服务器(强制订阅)或订阅服务器(请求订阅)请求。发布可以支持
强制订阅和请求订阅的混合。


---------------------------------------------------------------------------
SQL复制的工作原理
SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务
器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器
分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些
改变分发给订阅服务器


---------------------------------------------------------------------------
SQL SERVER复制技术类型,三种复制技术,分别是(详细的说明参考SQL联机帮助):
1、快照复制
2、事务复制
3、合并复制


============================================================================
下介绍实现复制的步骤。(以快照复制为例)


准备工作:

1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
我的电脑
--控制面板
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户

2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:

我的电脑--D:/ 新建一个目录,名为: PUB
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
--确定


3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)

开始--程序--管理工具--服务
--右键SQLSERVERAGENT
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名
--"密码"中输入该用户的密码

4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)

企业管理器
--右键SQL实例--属性
--安全性--身份验证
--选择"SQL Server 和 Windows"
--确定

5.在发布服务器和订阅服务器上互相注册
企业管理器
--右键SQL Server组
--新建SQL Server注册...
--下一步--可用的服务器中,输入你要注册的远程服务器名--添加
--下一步--连接使用,选择第二个"SQL Server身份验证"
--下一步--输入用户名和密码
--下一步--选择SQL Server组,也可以创建一个新组
--下一步--完成

6.对于只能用IP,不能用计算机名的,为其注册服务器别名
  (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始--程序--Microsoft SQL Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号


==============================================================================

正式开始:

1.配置发布服务器

a. 选中指定 [服务器] 节点
b. 从 [工具] 下拉菜单的 [复制] 子菜单中选择 [发布、订阅服务器和分发] 命令
c. 系统弹出一个对话框点 [下一步] 然后看着提示操作
--直到"指定快照文件夹"
--在"快照文件夹"中输入准备工作中创建的目录: ///pub
一[下一步] 直操作到完成。
d. 当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器
同时也生成一个分发数据库(distribution)


---------------------------------------------------------------------------

2.创建发布
a. 选中指定的服务器
b. 从 [工具] 菜单的 [复制] 子菜单中选择 [创建和管理发布] 命令。此时系统会弹出
一个对话框
c. 选择要创建发布的数据库,然后单击 [创建发布]
d. 在 [创建发布向导] 的提示对话框中单击 [下一步] 系统就会弹出一个对话框。对话
框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个
大家可以去看看帮助)
e. 单击 [下一步] 系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在
不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行
"SQL SERVER 2000"的数据库服务器
f. 单击 [下一步] ,选择要发布的对象(如表,视图,存储过程,一般是表)
g. 然后 [下一步] 直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了
一个共享数据库。


---------------------------------------------------------------------------

3.设计订阅
a. 选中指定的订阅服务器
b. 从 [工具] 下拉菜单中选择 [复制] 子菜单的 [请求订阅]
c. 按照提示单击 [下一步] 操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行
复制操作的前提条件是SQL SERVER代理服务必须已经启动。
d. 单击 [完成] 完成订阅操作。


----------------------------------------------------------------------------

完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?
这里可以通过这种方法来快速看是否成功。
展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度
把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。
接下来就是判断复制是否成功了打
开C:/Program Files/Microsoft SQL Server/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面
看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。
要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表

=====================================================================================
再加入一篇从数据库把表导出EXECL 文件的

用bcp导出生成的文件的实质是文本文件,如果要生成真正的excel文件,则用下面的.if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)
drop   procedure   [dbo].[p_exporttb]
/*--数据导出EXCEL
导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件
如果文件不存在,将自动创建文件
如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
--邹建   2003.10(引用请保留此信息)--*/
/*--调用示例
p_exporttb   @sqlstr='select   *   from   地区资料'
,@path='c:/',@fname='aa.xls',@sheetname='地区资料'
--*/
create   proc   p_exporttb
@sqlstr   varchar(8000), --查询语句,如果查询语句中使用了order   by   ,请加上top   100   percent
@path   nvarchar(1000), --文件存放目录
@fname   nvarchar(250), --文件名
@sheetname   varchar(250)='' --要创建的工作表名,默认为文件名
as  
declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int
declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)

--参数检测
if   isnull(@fname,'')='' set   @fname='temp.xls'
if   isnull(@sheetname,'')=''   set   @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在
if   right(@path,1)<>'/'   set   @path=@path+'/'
create   table   #tb(a   bit,b   bit,c   bit)
set   @sql=@path+@fname
insert   into   #tb   exec   master..xp_fileexist   @sql

--数据库创建语句
set   @sql=@path+@fname
if   exists(select   1   from   #tb   where   a=1)
set   @constr='DRIVER={Microsoft   Excel   Driver   (*.xls)};DSN='''';READONLY=FALSE'
        +';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended   Properties="Excel   8.0;HDR=YES'
+';DATABASE='+@sql+'"'

--连接数据库
exec   @err=sp_oacreate   'adodb.connection',@obj   out
if   @err<>0   goto   lberr

exec   @err=sp_oamethod   @obj,'open',null,@constr
if   @err<>0   goto   lberr

--创建表的SQL
declare   @tbname   sysname
set   @tbname='##tmp_'+convert(varchar(38),newid())
set   @sql='select   *   into   ['+@tbname+']   from('+@sqlstr+')   a'
exec(@sql)

select   @sql='',@fdlist=''
select   @fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+']   '
+case  
when   b.name   like   '%char'  
then   case   when   a.length>255   then   'memo'
else   'text('+cast(a.length   as   varchar)+')'   end
when   b.name   like   '%int'   or   b.name='bit'   then   'int'
when   b.name   like   '%datetime'   then   'datetime'
when   b.name   like   '%money'   then   'money'
when   b.name   like   '%text'   then   'memo'
else   b.name   end
FROM   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')
and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)
if   @@rowcount=0   return
select   @sql='create   table   ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql
if   @err<>0   goto   lberr
exec   @err=sp_oadestroy   @obj
--导入数据
set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'
exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   ['+@tbname+']')
set   @sql='drop   table   ['+@tbname+']'
exec(@sql)
return

lberr:
exec   sp_oageterrorinfo   0,@src   out,@desc   out
lbexit:
select   cast(@err   as   varbinary(4))   as   错误号
,@src   as   错误源,@desc   as   错误描述
select   @sql,@constr,@fdlist
go
60.   if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)
drop   procedure   [dbo].[p_exporttb]
GO
/*--数据导出dBase
导出查询语句中的数据到dBase,如果文件不存在,将自动创建文件
基于通用性考虑,仅支持导出标准数据类型
--邹建   2003.10--*/
/*--调用示例
--导出dBase
p_exporttb   @sqlstr='select   *   from   地区资料',@path='c:/',@over=1
--*/
create   proc   p_exporttb
@sqlstr   varchar(8000), --要导出的查询名
@path   nvarchar(1000), --文件存放目录
@fname   nvarchar(250)='temp.dbf',--文件名,默认为temp
@over   bit=0 --是否覆盖已经存在的文件,如果不覆盖,则直接追加
as
declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int
declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)

--参数检测
if   isnull(@fname,'')=''   set   @fname='temp.dbf'

--检查文件是否已经存在
if   right(@path,1)<>'/'   set   @path=@path+'/'
create   table   #tb(a   bit,b   bit,c   bit)
set   @sql=@path+@fname
insert   into   #tb   exec   master..xp_fileexist   @sql
if   exists(select   1   from   #tb   where   a=1)
if   @over=1
begin
set   @sql='del   '+@sql
exec   master..xp_cmdshell   @sql,no_output
end
else
set   @over=0
else
set   @over=1

--数据库创建语句
set   @sql=@path+@fname
set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended   Properties="dBASE   5.0;'
+';HDR=NO;DATABASE='+@path+'"'

--创建表的SQL
declare   @tbname   sysname
set   @tbname='##tmp_'+convert(varchar(38),newid())
set   @sql='select   *   into   ['+@tbname+']   from('+@sqlstr+')   a'
exec(@sql)

--连接数据库
exec   @err=sp_oacreate   'adodb.connection',@obj   out
if   @err<>0   goto   lberr

exec   @err=sp_oamethod   @obj,'open',null,@constr
if   @err<>0   goto   lberr

--创建表的SQL
select   @sql='',@fdlist=''
select   @fdlist=@fdlist+','+a.name
,@sql=@sql+',['+a.name+']   '
+case   when   b.name   in('char','nchar','varchar','nvarchar')   then
  'text('+cast(case   when   a.length>250   then   250   else   a.length   end   as   varchar)+')'
when   b.name   in('tynyint','int','bigint','tinyint')   then   'int'
when   b.name   in('smalldatetime','datetime')   then   'datetime'
when   b.name   in('money','smallmoney')   then   'money'
else   b.name   end
FROM   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)
select   @sql='create   table   ['+@fname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)

if   @over=1
begin
exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql
if   @err<>0   goto   lberr
end

exec   @err=sp_oadestroy   @obj

set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''dBase   5.0;DATABASE='
+@path+''',''select   *   from   ['+@fname+']'')'

--导入数据
exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   ['+@tbname+']')

set   @sql='drop   table   ['+@tbname+']'
exec(@sql)

return

lberr:
exec   sp_oageterrorinfo   0,@src   out,@desc   out
lbexit:
select   cast(@err   as   varbinary(4))   as   错误号
,@src   as   错误源,@desc   as   错误描述
select   @sql,@constr,@fdlist
go
========================================================================
bcp 导出数据
EXEC master..xp_cmdshell   'bcp   "SELECT   personcode ,   name, idencode   FROM   rxdata..personinfo   ORDER   BY   personcode"   queryout   D:/导出EXECL数据/个人资料.xls   -c   -S s   -U sa   -P p'

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16754036/viewspace-708368/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16754036/viewspace-708368/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下的 SQL 语句来查询 Oracle 数据库的结构信息: ```sql SELECT cols.table_name, cols.column_name, cols.nullable, cols.data_type, cols.data_length, cols.data_precision, cols.data_scale, cols.data_default, cols.column_id, cols.data_default, cons.constraint_type, cons.constraint_name, cons.r_constraint_name, com.comments, ( SELECT CASE WHEN COUNT(*) OVER (PARTITION BY cols.table_name, cols.column_name) > 1 THEN 1 ELSE 0 END FROM all_tab_columns c WHERE c.owner = cols.owner AND c.table_name = cols.table_name AND c.column_name = cols.column_name ) AS is_duplicated FROM all_tab_columns cols LEFT JOIN all_col_comments com ON cols.owner = com.owner AND cols.table_name = com.table_name AND cols.column_name = com.column_name LEFT JOIN ( SELECT cons.owner, cons.table_name, cols.column_name, cons.constraint_type, cons.constraint_name, cons.r_constraint_name FROM all_constraints cons JOIN all_cons_columns cols ON cols.owner = cons.owner AND cols.constraint_name = cons.constraint_name WHERE cons.constraint_type IN ('P', 'U') ) cons ON cols.owner = cons.owner AND cols.table_name = cons.table_name AND cols.column_name = cons.column_name WHERE cols.owner = 'YOUR_SCHEMA_NAME' AND cols.table_name = 'YOUR_TABLE_NAME' ORDER BY cols.table_name, cols.column_id; ``` 其中,将 `YOUR_SCHEMA_NAME` 和 `YOUR_TABLE_NAME` 替换为您所需查询的所在的 schema 名称和名称。执行后,您将可以得到如下的结构信息: - `table_name`:名称 - `column_name`:字段名称 - `nullable`:该字段是否可为空,值为 `Y` 或 `N` - `data_type`:字段类型 - `data_length`:字段长度 - `data_precision`:字段精度 - `data_scale`:字段小数位数 - `data_default`:字段缺省值 - `column_id`:字段中的顺序 - `constraint_type`:约束类型,如 Primary Key、Unique、Foreign Key 等 - `constraint_name`:约束名称 - `r_constraint_name`:外键关联的主键名称 - `comments`:字段描述 - `is_duplicated`:是否为重复字段,值为 `1` 或 `0`

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值