文档章节

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

顺其自然001
 顺其自然001
发布于 2014/03/04 14:22
字数 575
阅读 9
收藏 0
根據網上一個已有的存儲過程修改而來
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

© 著作权归作者所有

顺其自然001

顺其自然001

粉丝 18
博文 37
码字总数 13528
作品 0
卢湾
高级程序员
私信 提问
MsSQL中類似 MySQL replace into 的指令

記得多年前某個使用MySQL的專案,當時有個需求是當向資料表新增一筆資料的時候, 需要兒判斷是否存在,如存在時新增,反之則更新該筆資料。 記得那時侯的寫法是在程式中下一道查詢指令 SELE...

eddie
2013/08/31
33
0
机器翻译工具包--Apertium

Apertium是一個機器翻譯平台,由西班牙政府和加泰羅尼亞自治政府撥款支持阿利坎特大學開發,為一個以GNU通用公共許可證條件發行的自由軟體。 Apertium原是OpenTrad計劃中其中一個機器翻譯引擎...

匿名
2009/07/30
783
0
Tcpdump的使用

簡易使用法: (為了抓到隱藏在 Code 裡的語法, 直接看port有傳什麼資料進來) sudo tcpdump -nnnX -s 1500 port 3306 sudo tcpdump -aXXX port 3306 | grep denied -s : 抓比較長的 data 做一筆...

红薯
2009/01/07
636
0
為什麼 Node.js 不適合大型和商業專案?

JavaScript 和 Node.js 一直都是這幾年的話題,無論是前端還是後端,到處都可見 JavaScript,就好像爬滿了你全身上下,他們不斷地對你說道「嘿!老兄!快來用我吧!」。 為什麼 Node.js 會這...

临江仙卜算子
2018/05/25
37
7
sed (function Argument) 大全!

各位大家好!偶是一个新人,学习shell基本上通过通读论坛上高手的贴子来前进的。在学习的过程也遇到过很多问题,每每苦恼中总能得到CU上XDJM的耐心指点。关于wingger 同志发表了shell基础十二...

红薯
2009/05/06
326
0

没有更多内容

加载失败,请刷新页面

加载更多

linux查询日志命令总结

【背景】 排查线上环境问题,少不了去线上查日志。而使用什么命令,能快速准确地查到我们需要查找地日志信息,也是我们需要掌握的一项技能。 【命令】 Linux查看命令有多种:tail,head,cat...

chen-chen-chen
14分钟前
1
0
net/http 接收文件

代码展示,如何使用golang 自带net/http,将Form表单中提交上来的文件,指定位置保存。 ReadHtmlFile OutHtml(html网页,表单测试代码使用) SaveFile (处理提交文件) package mainimport...

听夜深窗外风
19分钟前
1
0
c++ 强制类型转换

强制类型转换 p545

天王盖地虎626
21分钟前
2
0
再读Golang中的异常处理

一起重温Golang中的异常处理啊😸 1.Golang语言中没有其他语言中的try...catch...语句来捕获异常和异常恢复 2.在Golang中我们通常会使用panic关键字来抛出异常,在defer中使用recover来捕获...

Andy-xu
40分钟前
7
0
TiDB 最佳实践系列(三)乐观锁事务

作者:Shirly TiDB 最佳实践系列是面向广大 TiDB 用户的系列教程,旨在深入浅出介绍 TiDB 的架构与原理,帮助用户在生产环境中最大限度发挥 TiDB 的优势。我们将分享一系列典型场景下的最佳实...

TiDB
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部