设为首页 收藏本站
查看: 376|回复: 0

[经验分享] 收藏几段SQL Server语句和存储过程

[复制链接]

尚未签到

发表于 2016-11-4 08:21:47 | 显示全部楼层 |阅读模式
  收藏几段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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295488-1-1.html 上篇帖子: 获取SQL Server数据库元数据的方法 下篇帖子: asp.net实现excel数据到sql server的导入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表