MsSql 根据表名和条件,生成Insert语句

简介: MsSql 根据表名和条件,生成Insert语句

ALTER proc [dbo].[proc_insert] (@tablename varchar(256),@where varchar(max))

as

begin

set nocount on

declare @sqlstr varchar(MAX)

declare @sqlstr1 varchar(MAX)

declare @sqlstr2 varchar(MAX)

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 =36 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'

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

 AND COLUMNPROPERTY(a.id, a.name, 'IsIdentity') <> 1

)t order by colid

select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from '+@tablename + ' where '+@where

-- print @sqlstr

exec(@sqlstr)

set nocount off

end


执行示例:


EXEC proc_insert '表名','age=18'


xtype的参照表:


   xtype=34 'image'

xtype= 35 'text'

xtype=36 'uniqueidentifier'

xtype=48 'tinyint'

xtype=52 'smallint'

xtype=56 'int'

xtype=58 'smalldatetime'

xtype=59 'real'

xtype=60 'money'

xtype=61 'datetime'

xtype=62 'float'

xtype=98 'sql_variant'

xtype=99 'ntext'

xtype=104 'bit'

xtype=106 'decimal'

xtype=108 'numeric'

xtype=122 'smallmoney'

xtype=127 'bigint'

xtype=165 'varbinary'

xtype=167 'varchar'


xtype=173 'binary'

xtype=175 'char'

xtype=189 'timestamp'

xtype=231 'nvarchar'


xtype=239 'nchar'

xtype=241 'xml'

xtype=231 'sysname'


相关文章
|
Java Maven
修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像
修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像
5650 0
|
Java 编译器
java: 源发行版 16 与 --enable-preview 一起使用时无效 (仅发行版 17 支持预览语言功能) & java: 错误: 无效的源发行版:15
java: 源发行版 16 与 --enable-preview 一起使用时无效 (仅发行版 17 支持预览语言功能) & java: 错误: 无效的源发行版:15
5247 0
|
物联网 Linux API
AliOS Things操作系统之设备驱动模型
开源操作系统中系统驱动框架做的最好的无疑是Linux系统,Linux系统中设计精良的驱动框架、设备树等功能会硬件厂商对接驱动系统的成本降到很低,并且通过接入VFS系统统一了Linux系统驱动对应用程序提供的接口。反观传统的RTOS系统大多数比较注重在内核功能的开发上,欠缺对驱动架构方面的设计。文本将介绍AliOS Things上设备驱动模型。
1193 20
|
2天前
|
云安全 人工智能 自然语言处理
|
6天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
569 13
|
9天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
701 56
Meta SAM3开源:让图像分割,听懂你的话
|
7天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
325 116