• 快速生成更新表语句


      今天同事和同事讨论一个问题:她在日常工作中需要更新表数据,场景如此下:表A和表A_bak,两个表的结构一致,表A中的数据需根据表A_bak中的数据进行更新或插入的操作。这里我们不采用Merge方式,不能满足她的需求。在更新的时候由A表的列特别多,好几十列,同事问有什么好的办法能生成这个Update语句吗?免去一列一列写的痛苦。当时有点忙,就只给出了我的想法,用Update From 语句,动态的去构造这个Update。下午忙完手边的活,就想自己动手写下,锻炼哈。我给出我写的SQL:

    数据结构如下:

      

    DECLARE @TableName VARCHAR(50),@TableNameBAk VARCHAR(50),@rowCount INT,@index INT,@col VARCHAR(200),@pkcol VARCHAR(200),@cols VARCHAR(max);
    DECLARE @t TABLE(id INT IDENTITY,colName VARCHAR(50));
    		
    SELECT  @TableName=N'Customers',@TableNameBAk=N'Customers_bak' ,@index=1; 
    INSERT INTO @t SELECT NAME FROM syscolumns WHERE id=object_id(@TableName)
    
    SET @rowCount=@@ROWCOUNT
    
    WHILE @index<@rowCount
    BEGIN
    	select @col=colName from @t where id=@index  
    	SET @index=@index+1
    	IF EXISTS(SELECT 1 
    				FROM  syscolumns  JOIN  sysindexkeys ON syscolumns.id=sysindexkeys.id  AND  syscolumns.colid=sysindexkeys.colid   
    					  JOIN  sysindexes   ON syscolumns.id=sysindexes.id  AND  sysindexkeys.indid=sysindexes.indid  
    					  JOIN  sysobjects   ON   sysindexes.name=sysobjects.name  AND  sysobjects.xtype='PK'
    				WHERE syscolumns.name=@col AND syscolumns.id=object_id(@TableName))
    	BEGIN	
    		SET @pkcol=	@col	
    		CONTINUE;
    	END 
    	SET @cols=ISNULL(@cols+',','')+@col+N'=a.'+@col; 
    END
    
    SET @cols=N'Update '+@TableName+N' Set '+@cols +N' from ( select * from '+@TableNameBAk+' ) a where '+@TableName+'.'+@pkcol+'=a.'+@pkcol+''
    PRINT @cols
    
    注意,表要有主键

      

  • 相关阅读:
    ubuntu15.10下各种编译环境的搭建(工作平台大转移)
    win7+ubuntu15.10的安装
    Qt之串口通信
    读C++代码必备专业名词
    好书好网站积累着有空看
    大数学家与中小学教育相关的资料(持续更新)
    《x的奇幻之旅》读书笔记
    冯·诺依曼为后生解围
    从一道简单的几何题说起
    Steiner-Lehmus 定理
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3487763.html
Copyright © 2020-2023  润新知