一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql)
2011-06-10 10:13
836 查看
1.提取某数据库中所有用户表的所有列:
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u')
2.提取某数据库中所有用户表的所有主键列:
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u') and colorder =1
3.提取某数据库中所有用户表的所有非主键列:
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u') and colorder <> 1
循环更新方法如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: LEAMON
-- Create date: 2011-06-10
-- Description: 循环更新该数据库中所有表的所有非主键列为某一值(存储类型为int/bigint/varchar/decimail)
-- =============================================
CREATE PROCEDURE [dbo].[P_UPALLTAB_LEAMON]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL VARCHAR(2000),
@TABLENAME VARCHAR(20),
@TABLEID INT,
@COLUNM VARCHAR(20)
DECLARE CUR_TABLE CURSOR FOR
SELECT ID,[NAME] FROM SYSOBJECTS WHERE XTYPE='U' ORDER BY [NAME]
OPEN CUR_TABLE
FETCH NEXT FROM CUR_TABLE INTO @TABLEID,@TABLENAME
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE CUR_COLUMN CURSOR FOR
SELECT [NAME] FROM SYSCOLUMNS WHERE XTYPE IN('56','167','106','127') AND COLORDER <> '1' AND ID=@TABLEID
OPEN CUR_COLUMN
FETCH NEXT FROM CUR_COLUMN INTO @COLUNM
WHILE @@FETCH_STATUS=0
BEGIN
SET @SQL='UPDATE '+@TABLENAME+' SET '+@COLUNM+' = NULL WHERE '+@COLUNM+' IN (''-999'',''-95'')'
EXEC (@SQL)
FETCH NEXT FROM CUR_COLUMN INTO @COLUNM
END
CLOSE CUR_COLUMN
DEALLOCATE CUR_COLUMN
FETCH NEXT FROM CUR_TABLE INTO @TABLEID,@TABLENAME
END
CLOSE CUR_TABLE
DEALLOCATE CUR_TABLE
PRINT '更新作业完成'
END
--执行:EXEC P_UPALLTAB_LEAMON
-----------------------------------------------------------------------------
附:sql系统表syscolumns中 xtype 所有值对应的类型名称
----------------------------------------------------------
以下为mysql方法:
-- =============================================
-- Author: LEAMON
-- Create date: 2011-06-13
-- =============================================
use test;
drop procedure if exists P_UPALLTAB_LEAMON;
CREATE PROCEDURE P_UPALLTAB_LEAMON()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE cTbl varchar(64);
DECLARE cCol varchar(64);
DECLARE cur1 CURSOR FOR
select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='test' AND DATA_TYPE in ('varchar','int','BIGINT','decimal') AND ORDINAL_POSITION <> 1 order by TABLE_NAME;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
set @sqlDrop='';
OPEN cur1;
FETCH cur1 INTO cTbl, cCol;/*得到表名及列名*/
WHILE done = 0 DO
set @x=0;
set @sql=concat('select 1 into @x from ',cTbl,' where ',cCol,' in (''-999'',''-95'',''-99'',''-97'') limit 1');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
if @x<>0 then
set @sqlupdate=concat('update `',cTbl,'` set `',cCol,'` = ''null'' where `' ,cCol,'` in (''-999'',''-95'',''-99'',''-97'') ;');
PREPARE stmt1 FROM @sqlupdate;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
end if ;
set done = 0;
FETCH cur1 INTO cTbl, cCol;
END WHILE;
CLOSE cur1;
END
--执行: CALL P_UPALLTAB_LEAMON( )
--备注:mysql更新为null 的字段,仅varchar为更新为null;其余三个数值字段会自动更新为0。
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u')
2.提取某数据库中所有用户表的所有主键列:
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u') and colorder =1
3.提取某数据库中所有用户表的所有非主键列:
SELECT TOP 100 * FROM syscolumns c WHERE c.id IN (SELECT id FROM sysobjects WHERE xtype='u') and colorder <> 1
循环更新方法如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: LEAMON
-- Create date: 2011-06-10
-- Description: 循环更新该数据库中所有表的所有非主键列为某一值(存储类型为int/bigint/varchar/decimail)
-- =============================================
CREATE PROCEDURE [dbo].[P_UPALLTAB_LEAMON]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL VARCHAR(2000),
@TABLENAME VARCHAR(20),
@TABLEID INT,
@COLUNM VARCHAR(20)
DECLARE CUR_TABLE CURSOR FOR
SELECT ID,[NAME] FROM SYSOBJECTS WHERE XTYPE='U' ORDER BY [NAME]
OPEN CUR_TABLE
FETCH NEXT FROM CUR_TABLE INTO @TABLEID,@TABLENAME
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE CUR_COLUMN CURSOR FOR
SELECT [NAME] FROM SYSCOLUMNS WHERE XTYPE IN('56','167','106','127') AND COLORDER <> '1' AND ID=@TABLEID
OPEN CUR_COLUMN
FETCH NEXT FROM CUR_COLUMN INTO @COLUNM
WHILE @@FETCH_STATUS=0
BEGIN
SET @SQL='UPDATE '+@TABLENAME+' SET '+@COLUNM+' = NULL WHERE '+@COLUNM+' IN (''-999'',''-95'')'
EXEC (@SQL)
FETCH NEXT FROM CUR_COLUMN INTO @COLUNM
END
CLOSE CUR_COLUMN
DEALLOCATE CUR_COLUMN
FETCH NEXT FROM CUR_TABLE INTO @TABLEID,@TABLENAME
END
CLOSE CUR_TABLE
DEALLOCATE CUR_TABLE
PRINT '更新作业完成'
END
--执行:EXEC P_UPALLTAB_LEAMON
-----------------------------------------------------------------------------
附:sql系统表syscolumns中 xtype 所有值对应的类型名称
xtype 类型
====== 34 image 35 text 36 uniqueidentifier 48 tinyint 52 smallint 56 int 58 smalldatetime 59 real 60 money 61 datetime 62 float 98 sql_variant 99 ntext 104 bit 106 decimal 108 numeric 122 smallmoney 127 bigint 165 varbinary 167 varchar 173 binary 175 char 189 timestamp 231 sysname 231 nvarchar 239 nchar
----------------------------------------------------------
以下为mysql方法:
-- =============================================
-- Author: LEAMON
-- Create date: 2011-06-13
-- =============================================
use test;
drop procedure if exists P_UPALLTAB_LEAMON;
CREATE PROCEDURE P_UPALLTAB_LEAMON()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE cTbl varchar(64);
DECLARE cCol varchar(64);
DECLARE cur1 CURSOR FOR
select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='test' AND DATA_TYPE in ('varchar','int','BIGINT','decimal') AND ORDINAL_POSITION <> 1 order by TABLE_NAME;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
set @sqlDrop='';
OPEN cur1;
FETCH cur1 INTO cTbl, cCol;/*得到表名及列名*/
WHILE done = 0 DO
set @x=0;
set @sql=concat('select 1 into @x from ',cTbl,' where ',cCol,' in (''-999'',''-95'',''-99'',''-97'') limit 1');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
if @x<>0 then
set @sqlupdate=concat('update `',cTbl,'` set `',cCol,'` = ''null'' where `' ,cCol,'` in (''-999'',''-95'',''-99'',''-97'') ;');
PREPARE stmt1 FROM @sqlupdate;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
end if ;
set done = 0;
FETCH cur1 INTO cTbl, cCol;
END WHILE;
CLOSE cur1;
END
--执行: CALL P_UPALLTAB_LEAMON( )
--备注:mysql更新为null 的字段,仅varchar为更新为null;其余三个数值字段会自动更新为0。
相关文章推荐
- SQL2005错误:"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行. "解决方法
- 移动文章分类的sql语句,查询并更新同一个表的方法 You can't specify target table 'news_articles' for update in FROM clause
- MySQL:两表更新(用一个表更新另一个表)的SQL语句
- 一个关于“OLE DB 提供程序 'sqloledb' 指出该对象中没有任何列”错误的解决方法
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- Sql查询一个表中除了某个字段以外的所有字段的方法
- sql 一个表的字段更新至另一个字段的方法
- 导入SQL导致"MySQL server has gone away"的解决方法
- SQL2005 "user" islock 用户不能正常登录的处理方法
- 网站后台登录aspcms 提示错误号:-2147467259,错误描述:操作必须使用一个可更新的查询。sql=update AspCms_Content set TimeStatus=0 where TimeStatus=1 and Timeing <= 解决方法。
- mysql 用sql语句查询一个表中的所有字段类型、注释
- MySQL循环遍历执行查询SQL语句结果的方法
- sql 语句 写一个函数T-sql函数elimination(a,b)将出现在第一个字符串中的第二个字符串中的所有字符删除,即:select dbo.elimination('abcdefg123
- sql创建一个表变量,并循环表,更新有一个字段
- sql批量更新字段值,sql所有字段的所有记录替换方法,sql获取所有字段并更新
- mysql 按月分组累计统计数据,纯sql实现的一个方法
- SQL 2005附加数据库为"只读"的解决方法
- 批量删除mysql一个库所有数据表方法
- 如何批量将一个文件夹下所有的SQL文件执行,更新到数据库
- 【SQL精彩语句】SQL SERVER 2005中查询指定节点及其所有子节点的方法(表格形式显示)