`
gybmike
  • 浏览: 179965 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

將資料表中的資料轉換為insert語句,并增加判斷條件

阅读更多
根據網上一個已有的存儲過程修改而來
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tool_GenInsertSQL]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[tool_GenInsertSQL]
GO
/*功能:將資料表中的資料轉換為insert語句,并增加判斷條件
*MSSQL 查詢分析器需調整 
*工具--選項--結果--每個資料行的字元數,增大到1024或更大,避免一行中資料較多,保存時會被截斷問題
* exec dbo.emisGenInsertSQL'ins_d','s_no,in_no','where s_no = ''000001'''
*/
create procedure tool_GenInsertSQL
(
    @TableName varchar(256)--資料表名
    ,@ExistCond varchar(256)--判斷條件中需要用於判斷的字段名稱,若有多個需用 "," 分隔,若不需判斷條件請給空字串
    ,@WhereOrderByClause varchar(1000) = '' --用於資料表的查詢條件和排序'where 1 = 1 order by null'
)
as
begin
    declare @sql varchar(8000)
    declare @sqlValues varchar(8000)
    declare @sqlExist varchar(1000) set @sqlExist=''
    declare @deli varchar(1) set @deli=','--分隔符,若傳入的判斷條件包多字段(多主鍵)
    declare @sqlExistCond varchar(1000) set @sqlExistCond = '(1=1)' --最終的判斷條件 
    declare @tempCond varchar(100)
    if @ExistCond>'' --不等於空才加判斷條件
        begin
	    --組判斷條件開始
	    while(  charindex(@deli,@ExistCond)>0 )
	             begin
		set @tempCond = substring(@ExistCond,1,charindex(@deli,@ExistCond)-1)
		set @sqlExistCond = @sqlExistCond + ' and ['+@tempCond+'] = ''''''+cast ('+@tempCond  +' as varchar)+'''''''
		set @ExistCond = substring(@ExistCond,charindex(@deli,@ExistCond)+1,len(@ExistCond))	
	             end		
	     set @sqlExistCond = @sqlExistCond + ' and ['+@ExistCond+'] = ''''''+cast ('+@ExistCond  +' as varchar)+'''''')'
	     set @sqlExist = 'if not exists (select 1 from ['+@TableName+'] where ' + @sqlExistCond--判斷條件
	     --組判斷條件完成 	
         end
    set @sql = ' ''(''' + char(13) + ','
    set @sqlValues = ' values ('''+ char(13) + ','
    --查出系統表中指定表的列名
    select @sqlValues = @sqlValues + cols + ' + '',' + '''' + char(13) + ','
            ,@sql = @sql + '''[' + name + '],''' + char(13) + ','
    from
    (
        select
            case
                when xtype in (48,52,56,59,60,62,104,106,108,122,127)
                -- 48 tinyint 52 smallint 56 int 59 real 60 money 62 float 104 bit 106 decimal 108 numeric 122 smallmoney 127 bigint
                    then 'case when ' + name + ' is null then ''NULL'' else ' + 'cast(' + name + ' as varchar)' + ' end'
                when xtype in (58,61)
                -- 58 smalldatetime 61 datetime
                    then 'case when ' + name + ' is null then ''NULL'' else ' + ''''''''' + ' + 'cast(' + name + ' as varchar)' + '+''''''''' + ' end'
                when xtype in (167,175)
                --  167 varchar 175 char	
                    then 'case when ' + name + ' is null then ''NULL'' else ' + ''''''''' + ' + 'replace(' + name + ','''''''','''''''''''')' + ' + ''''''''' + ' end'
                when xtype in (231,239)
                --231 nvarchar 239 nchar 
                    then 'case when ' + name + ' is null then ''NULL'' else ' + '''N'''''' + ' + 'replace(' + name + ','''''''','''''''''''')' + ' + ''''''''' + ' end'
                else '''NULL'''
            end as Cols
            ,name
        from syscolumns
        where id = object_id(@TableName)
                and autoval is null --忽略自動增長字段
    ) T
    --組最終sql成查詢語句并執行
    set @sql = 'select ''' + @sqlExist+''',' + char(13) + '''INSERT INTO ''' + char(13) + ','
                 + '''['+ @TableName + ']''' + char(13) + ','
                 + left(@sql,len(@sql)-4) + '''' + char(13) + ','')' + left(@sqlValues,len(@sqlValues)-7) + ','')'''
                 + char(13) + 'from [' + @TableName + ']'
                 + char(13) + @WhereOrderByClause

    print @sql -- print SQL 是完整正确的
    exec (@sql)

end

分享到:
评论

相关推荐

    精通sql结构化查询语句

    10.5 UNIQUE子查询与嵌套子查询 10.5.1 UNIQUE子查询 10.5.2 嵌套子查询 10.6 小结第4篇 T-SQL开发常用操作篇第11章 数据的维护操作 11.1 数据的插入操作 11.1.1 INSERT语句的基本语法 11.1.2 插入单条记录 11.1.3 ...

    Oraclet中的触发器

    INSERTING 如果触发语句是 INSERT 语句,则为TRUE,否则为FALSE UPDATING 如果触发语句是 UPDATE语句,则为TRUE,否则为FALSE DELETING 如果触发语句是 DELETE 语句,则为TRUE,否则为FALSE 重新编译触发器 如果...

    精通SQL--结构化查询语言详解

    10.1.1 在多表查询中使用子查询 187 10.1.2 在子查询中使用聚合函数 188 10.2 创建和使用返回多行的子查询 190 10.2.1 in子查询 190 10.2.2 in子查询实现集合交和集合差运算 191 10.2.3 exists子查询 192 ...

    精通SQL 结构化查询语言详解

    18.4.2 SQL Server中表级锁的使用  18.4.3 设置隔离级别实现并发控制 18.4.4 死锁及其预防  18.5 Oracle中的并发事务控制  18.5.1 通过加锁避免写数据丢失 18.5.2 设置只读事务(READ ONLY)  18.5.3 ...

    mysql数据库的基本操作语法

    当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。 注意:外键约束的参照列,在主表中引用的只能...

    kellerMapper.jar

    TypeCaster.java:类型转换,用于将 Java 中的数据类型转换成相应的 MySql 数据类型 util:工具类相关 Console.java:日志输出工具类,用于在控制台、日志文件中输出相关信息 ObjectUtils.java:Object 工具类,...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...

    C#全能速查宝典

    1.3.10 switch case语句——条件判断语句 39 1.3.11 throw语句——显式引发异常 40 1.3.12 try…catch…finally语句——捕捉异常 42 1.3.13 while语句——循环语句 43 1.4 字符串处理 44 1.4.1 AddDays方法——添加...

    Delphi开发范例宝典目录

    实例029 为窗体增加边框 36 1.9 窗体动画 37 实例030 窗体中的滚动字幕 37 实例031 动画显示窗体 38 实例032 制作闪烁的窗体 39 实例033 直接在窗体上绘图 40 实例034 动画形式的程序界面 41 实例035...

    SQL性能优化

     以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的...

    达梦数据库用户手册基础学习版.rar

    3.4.2 修改表空间语句 75 目录 3.4.3 表空间删除语句 77 3.4.4 表空间失效文件检查 77 3.4.5 表空间失效文件恢复准备 78 3.4.6 表空间失效文件恢复 78 3.5 管理 HTS 表空间 78 3.5.1 创建 HTS 表空间 79 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例142 将日期和时间转换为时间戳 170 实例143 获取系统中的特定日期和时间 171 实例144 比较时间的大小 172 实例145 计算考试时间 173 实例146 倒计时 173 实例147 网页闹钟 174 实例148 计算程序运行时间 176 第3...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例142 将日期和时间转换为时间戳 170 实例143 获取系统中的特定日期和时间 171 实例144 比较时间的大小 172 实例145 计算考试时间 173 实例146 倒计时 173 实例147 网页闹钟 174 实例148 计算程序运行时间 176 第3...

    PL/SQL 基础.doc

    IF boolean_expr(条件) THEN /* 加条件语句,当满足条件时候退出循环*/ EXIT; /* EXIT WHEN boolean_expr */ END IF; END LOOP; 2) WHILE 循环 WHILE boolean_expr(条件) LOOP /* boolean_expr 循环条件*/...

    C语言程序设计标准教程

    例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译...

Global site tag (gtag.js) - Google Analytics