T-SQL 存储过程: (修订版) 根据基本表结构及其数据生成 INSERT INTO ... 的 SQL

根据基本表结构及其数据生成 INSERT INTO ... SQL 的 T-SQL 存储过程
,在网上能够搜索出的版本主要有两个:
1. CSDN Sky_blue 所作: proc_insert   (可 google)
2. CSDN playyuer 所作: spGenInsertSQL   (可 google)
但这两个版本的程序都曾收录到:
http://www.cnblogs.com/kasafuma/articles/109922.html
但这两个版本程序都有局限性:
如果字段太多或字段值的内容太多而无法生成完整正确的 insert into ... 的 SQL!
例如:

None.gif use  Northwind
None.gifproc_insert 
' employees '
None.gifspGenInsertSQL 
' employees '

执行后均得不到完整正确的 SQL!
其实存储过程本身的代码应该是没有错误
,只是因为字段太多或字段值的内容太多,varchar 变量容量不够大!
,应该算 Microsoft SQL Server 的缺陷
这个问题已经存在了很久了,长达至少两年多了!
今天终于被窝想到了解决办法,其实很简单:

这两个版本程序生成的 insert sql 都只用了一个字段(变量)
只要多用几个字段即可:
原来是: select f2+f2+f3+ ... +fn
现改为: select f2,f2,f3, ... ,fn
即可!

1.新版本,降低 "字段数量或字段值内容太多" 的影响 而尽量生成正确完整的 INSERT INTO ... SQL:

None.gif alter   procedure  Z_SP_GenInsertSQL
None.gif(
None.gif    
@TableName   varchar ( 256 )
None.gif    ,
@AllTopClause   varchar ( 1000 =   ''
None.gif    ,
@WhereOrderByClause   varchar ( 1000 =   ''   -- 'where 1 = 1 order by null'
None.gif
)
None.gif
as
None.gif
begin
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gifusage:
InBlock.gifZ_SP_GenInsertSQL 'employees','all top 30 PERCENT with ties ','where [LastName] is not null order by employeeid desc'
ExpandedBlockEnd.gif
*/

None.gif    
declare   @sql   varchar ( 8000 )
None.gif    
declare   @sqlValues   varchar ( 8000 )
None.gif    
set   @sql   =   '   '' ( '''   +   char ( 13 +   ' , '
None.gif    
set   @sqlValues   =   '  values ( ''' +   char ( 13 +   ' , '
None.gif    
select   @sqlValues   =   @sqlValues   +  cols  +   '  +  '' , '   +   ''''   +   char ( 13 +   ' , '
None.gif            ,
@sql   =   @sql   +   ''' [ '   +  name  +   ' ], '''   +   char ( 13 +   ' , '
None.gif    
from
None.gif    (
None.gif        
select
None.gif            
case
None.gif                
when  xtype  in  ( 48 , 52 , 56 , 59 , 60 , 62 , 104 , 106 , 108 , 122 , 127 )
None.gif                    
then   ' case when  '   +  name  +   '  is null then  '' NULL ''  else  '   +   ' cast( '   +  name  +   '  as varchar) '   +   '  end '
None.gif                
when  xtype  in  ( 58 , 61 )
None.gif                    
then   ' case when  '   +  name  +   '  is null then  '' NULL ''  else  '   +   '''''''''  +  '   +   ' cast( '   +  name  +   '  as varchar) '   +   ' + '''''''''   +   '  end '
None.gif                
when  xtype  in  ( 167 , 175 )
None.gif                    
then   ' case when  '   +  name  +   '  is null then  '' NULL ''  else  '   +   '''''''''  +  '   +   ' replace( '   +  name  +   ' , '''''''' , '''''''''''' ) '   +   '  +  '''''''''   +   '  end '
None.gif                
when  xtype  in  ( 231 , 239 )
None.gif                    
then   ' case when  '   +  name  +   '  is null then  '' NULL ''  else  '   +   ''' N ''''''  +  '   +   ' replace( '   +  name  +   ' , '''''''' , '''''''''''' ) '   +   '  +  '''''''''   +   '  end '
None.gif                
else   ''' NULL '''
None.gif            
end   as  Cols
None.gif            ,name
None.gif        
from  syscolumns
None.gif        
where  id  =   object_id ( @TableName )
None.gif                
-- and autoval is null --忽略自增整型字段
None.gif
    ) T
None.gif    
set   @sql   =   ' select  '   +   @AllTopClause   +   char ( 13 +   ''' INSERT INTO  '''   +   char ( 13 +   ' , '
None.gif                 
+   ''' [ ' +   @TableName   +   ' ] '''   +   char ( 13 +   ' , '
None.gif                 
+   left ( @sql , len ( @sql ) - 4 +   ''''   +   char ( 13 +   ' , '' ) '   +   left ( @sqlValues , len ( @sqlValues ) - 7 +   ' , '' ) '''
None.gif                 
+   char ( 13 +   ' from [ '   +   @TableName   +   ' ] '
None.gif                 
+   char ( 13 +   @WhereOrderByClause
None.gif    
-- select @sql -- select SQL 被截断
None.gif
     print   @sql   --  print SQL 是完整正确的
None.gif
     exec  ( @sql )
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gifselect *
InBlock.giffrom syscolumns    
InBlock.gifwhere id = object_id('test') and autoval is null
ExpandedBlockEnd.gif
*/

None.gif
end


2.老版本 如果字段太多或字段值的内容太多而无法生成完整正确的 insert into ... 的 SQL

None.gif create    proc  Z_SP_GenInsertSQL ( @tablename   varchar ( 256 ))
None.gif
as
None.gif
begin
None.gif  
declare   @sql   varchar ( 8000 )
None.gif  
declare   @sqlValues   varchar ( 8000 )
None.gif  
set   @sql   = '  ( '   +   char ( 9 )
None.gif  
set   @sqlValues   =   ' values  ' +   char ( 9 +   ' ( '   +   char ( 9 +   ''' + '
None.gif  
select   @sqlValues   =   @sqlValues   +  cols  +   '  +  '' , '   +   char ( 9 +   '''  +  '   , @sql   =   @sql   +   ' [ '   +  name  +   ' ], '   +   CHAR ( 9 )
None.gif    
from  
None.gif        (
select   case  
None.gif                  
when  xtype  in  ( 48 , 52 , 56 , 59 , 60 , 62 , 104 , 106 , 108 , 122 , 127 )                                
None.gif                       
then   ' case when  ' +  name  + '  is null then  '' NULL ''  else  '   +   ' cast( ' +  name  +   '  as varchar) ' + '  end '
None.gif                  
when  xtype  in  ( 58 , 61 )
None.gif                       
then   ' case when  ' +  name  + '  is null then  '' NULL ''  else  ' + '''''''''  +  '   +   ' cast( ' +  name  + '  as varchar) ' +   ' + ''''''''' + '  end '
None.gif                  
when  xtype  in  ( 167 , 175 )
None.gif                       
then   ' case when  ' +  name  + '  is null then  '' NULL ''  else  ' + '''''''''  +  '   +   ' replace( ' +  name + ' , '''''''' , '''''''''''' ) '   +   ' + '''''''''   +   '  end '
None.gif                  
when  xtype  in  ( 231 , 239 )
None.gif                       
then   ' case when  ' +  name  + '  is null then  '' NULL ''  else  ' + ''' N ''''''  +  '   +   ' replace( ' +  name + ' , '''''''' , '''''''''''' ) '   +   ' + '''''''''   +   '  end '
None.gif                  
else   ''' NULL '''
None.gif                
end   as  Cols,name
None.gif           
from  syscolumns  
None.gif          
where  id  =   object_id ( @tablename and  autoval  is   null
None.gif        ) T 
None.gif  
set   @sql   = ' select  '' INSERT INTO  '   +   CHAR ( 9 +   ' [ ' +   @tablename   +   ' ] '   +   CHAR ( 9 +   left ( @sql , len ( @sql ) - 2 +   char ( 9 +   ' '    +   CHAR ( 9 +   left ( @sqlValues , len ( @sqlValues ) - 5 +   char ( 9 +   ' ) ''  from  ' + @tablename
None.gif  
print   @sql
None.gif  
exec  ( @sql )
ExpandedBlockStart.gifContractedBlock.gif
/**/ /**/ /**/ /*
InBlock.gifselect *
InBlock.giffrom syscolumns  
InBlock.gifwhere id = object_id('test') and autoval is null
ExpandedBlockEnd.gif
*/

None.gif
end
None.gif


3. .Net/C# 版本请看:
http://www.cnblogs.com/Microshaoft/archive/2005/07/19/195752.html

转载于:https://www.cnblogs.com/Microshaoft/archive/2005/08/06/208876.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值