根据基本表结构及其数据生成 INSERT INTO ... 的 SQL

介绍了一种改进的方法来生成插入SQL语句的T-SQL存储过程,解决了字段过多或字段内容过长导致的问题。通过将字段值分散到多个字段中,确保生成的SQL语句既完整又正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据基本表结构及其数据生成 INSERT INTO ... SQL 的 T-SQL 存储过程
,在网上能够搜索出的版本主要有两个:
1. 优快云 Sky_blue 所作: proc_insert (可 google)
2. 优快云 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 ) = '' -- 'where1=1orderbynull'
None.gif
)
None.gif
as
None.gif
begin
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gifusage:
InBlock.gifZ_SP_GenInsertSQL'employees','alltop30PERCENTwithties','where[LastName]isnotnullorderbyemployeeiddesc'
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 ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ' cast( ' + name + ' asvarchar) ' + ' end '
None.gif
when xtype in ( 58 , 61 )
None.gif
then ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ''''''''' + ' + ' cast( ' + name + ' asvarchar) ' + ' + ''''''''' + ' end '
None.gif
when xtype in ( 167 , 175 )
None.gif
then ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ''''''''' + ' + ' replace( ' + name + ' , '''''''' , '''''''''''' ) ' + ' + ''''''''' + ' end '
None.gif
when xtype in ( 231 , 239 )
None.gif
then ' casewhen ' + name + ' isnullthen '' 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
-- andautovalisnull--忽略自增整型字段
None.gif
)T
None.gif
set @sql = ' select ' + @AllTopClause + char ( 13 ) + ''' INSERTINTO ''' + 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--selectSQL被截断
None.gif
print @sql -- printSQL是完整正确的
None.gif
exec ( @sql )
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gifselect*
InBlock.giffromsyscolumns
InBlock.gifwhereid=object_id('test')andautovalisnull
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 ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ' cast( ' + name + ' asvarchar) ' + ' end '
None.gif
when xtype in ( 58 , 61 )
None.gif
then ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ''''''''' + ' + ' cast( ' + name + ' asvarchar) ' + ' + ''''''''' + ' end '
None.gif
when xtype in ( 167 , 175 )
None.gif
then ' casewhen ' + name + ' isnullthen '' NULL '' else ' + ''''''''' + ' + ' replace( ' + name + ' , '''''''' , '''''''''''' ) ' + ' + ''''''''' + ' end '
None.gif
when xtype in ( 231 , 239 )
None.gif
then ' casewhen ' + name + ' isnullthen '' 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 '' INSERTINTO ' + 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.giffromsyscolumns
InBlock.gifwhereid=object_id('test')andautovalisnull
ExpandedBlockEnd.gif
*/

None.gif
end
None.gif


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值