微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

收藏几段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, ' PRECISION ' as  长度,


       
isnull ( COLUMNPROPERTY (a.id, ' 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),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.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),2) ' + '  end '


       
when  a.xtype  = 58    then   ' case when  ' + a.name + '  is null then  '' NULL ''  else  ' + ''''''''' + ' + ' convert(varchar(23),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.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

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐