Username: Password:

有用的SQL Server语句和存储过程-数据库专栏,SQL Server
来源:作者: 发布时间:2007-12-25 13:39:05

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=nset @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=nset @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=nset @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


 



 


说明:本贴纯属收藏,?自李洪根的blog 

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅