如何同时对多个表或列操作

原创 2004年04月26日 10:52:00

如何同时对多个表或列操作

    通过使用这个存储过程,你就可以方便的对数据库中具有一定规则的或者全部表,对这里的字段进行各种操作,具体看示例!

CREATE PROCEDURE SP_execSQLonDB
 (@TABLENAME VARCHAR(50),        --表名条件
  @COLUMNNAME VARCHAR(50),       --字段条件
  @SQL NVARCHAR(4000),           --执行的SQL
  @INCLUDE_NTI CHAR(1) = 'N')    --是否包含Text,NText,Image数据类
AS
BEGIN
 --Variable Declaration
 --变量定义

 DECLARE @strSQL NVARCHAR(4000)
 DECLARE @SQL2 NVARCHAR(4000)
 DECLARE @sTableName VARCHAR(200)
 DECLARE @sColumnName VARCHAR(200)

DECLARE @SQLTemp NVARCHAR(4000)

 --Check whether to include TEXT, NTEXT, IMAGE data types
 --检查是否需要包含 Text,NText,Image数据类型

 SET @INCLUDE_NTI = UPPER(LTRIM(RTRIM(@INCLUDE_NTI)))
 IF @INCLUDE_NTI NOT IN ('N', 'Y')
  SET @INCLUDE_NTI = 'N'

 --Construct a cursor to get the list of Table/Column Names according to the @TABLENAME and @COLUMNNAME parameters.
 --创建一个游标来读取表名和列名的列表,这里列表由参数@TABLENAME 和 @COLUMNNAME 决定
 SET @strSQL = N'DECLARE TabColCursor CURSOR FOR SELECT RTRIM(LTRIM(SU.name)) + ''.'' + LTRIM(RTRIM(SO.name)), SC.name FROM sysobjects SO INNER JOIN syscolumns SC ON SO.id = SC.id INNER JOIN sysusers SU ON SO.uid = SU.uid WHERE SO.xtype = ''U'' '

 --Filter out Text/NText/Image data types if it is not included
 --假如不包含Text/NText/Image数据类型,把他们过滤掉

 IF @INCLUDE_NTI = 'N'
  --In SysColumns sytem table XTYPE column corresponds to Column Data Type
  SET @strSQL = @strSQL + ' AND SC.xtype NOT IN (35, 99, 34) '

 --Add the TABLE(S) name i.e. filter if it is supplied
 --假如有提供表名参数,把它写入过滤条件中

 IF @TABLENAME IS NOT NULL AND ltrim(rtrim(@TABLENAME)) <> ''
 BEGIN
  SET @TABLENAME = REPLACE(@TABLENAME, ', ', ',')
  SET @strSQL = @strSQL + ' AND (SO.name LIKE ''' + REPLACE(@TABLENAME, ',', ''' OR SO.name LIKE ''') + ''')'
  SET @SQLTemp= ' AND (SO.name LIKE ''' + REPLACE(@TABLENAME, ',', ''' OR SO.name LIKE ''') + ''')'
 END

 --Add the COLUMN(S) name i.e. filter if it is supplied
 --假如有提供列名参数,把它写入过滤条件中

 IF @COLUMNNAME IS NOT NULL AND ltrim(rtrim(@COLUMNNAME)) <> ''
 BEGIN
  SET @COLUMNNAME = REPLACE(@COLUMNNAME, ', ', ',')
  SET @strSQL = @strSQL + ' AND (SC.name LIKE ''' + REPLACE(@COLUMNNAME, ',', ''' OR SC.name LIKE ''') + ''')'
 END

--Execute the constructed "Cursor Declaration" string
--执行定义游标的SQL语句

 EXECUTE sp_executesql @strSQL
 
 IF @@ERROR > 0
 BEGIN
  PRINT 'Error while declaring the Cursor.  Please check out the parameters supplied to the Procedure'
  RETURN -1
 END

 --Database Transaction.
 --标记一个显式本地事务的起始点

 BEGIN TRANSACTION gDatabaseTrans

 --Open the cursor
 --打开游标

 OPEN TabColCursor     

 --Fetch te Table, Column names to variables
 --用游标取出标名、列名对应到参数

 FETCH NEXT FROM TabColCursor
 INTO @sTableName, @sColumnName

 --Execute the SQL statement supplied in @SQL parameter on every row of Cursor's data
 --对于每一行游标取出的数据,执行由@SQL参数传进来的SQL语句
 WHILE @@FETCH_STATUS = 0
 BEGIN
  --Construct SQL2 to Execute supplied @SQL
  --by replacing @TABLENAME, @COLUMNNAME with running Table Name, Column Name of Cursor's data
  --用游标取出的表名列名来替换@SQL中的@TABLENAME, @COLUMNNAME来构造SQL2

  SET @SQL2 = @SQL
  SET @SQL2 = REPLACE(@SQL2, '@TABLENAME', @sTableName)
  SET @SQL2 = REPLACE(@SQL2, '@COLUMNNAME', @sColumnName)

  --Execute the constructed SQL2
  --执行SQL2

  EXECUTE sp_executesql @SQL2
 
  --Check for errors
  --检查错误

  IF @@ERROR <> 0
  BEGIN
   --On Error, Destroy objects, Rollback transaction
   --Return -1 as UNSUCCESSFUL flag
   --如果发生错误,删除游标,回滚
   --返回错误标记 -1

   PRINT 'Error occurred'
   DEALLOCATE TabColCursor
   ROLLBACK TRANSACTION gDatabaseTrans
   RETURN -1
  END

  --Process Next Row of Cursor
  --进行下一行数据

  FETCH NEXT FROM TabColCursor
  INTO @sTableName,@sColumnName
 END

 --Destroy CURSOR object
 --删除游标

 DEALLOCATE TabColCursor

 --Procedure executed properly. Commit the Transaction.
 --Return 0 as SUCCESSFUL flag
 --成功完成存储过程,成功结束事务
 --返回成功标记 0

 COMMIT TRANSACTION gDatabaseTrans
 RETURN 0
END

使用例子

1、这个例子在NORTHWIND数据库上执行
把所有表中列名包含Name的列中,把以“Ltd.”结尾的列替换成“LIMITED”。
用 SELECT * FROM Suppliers检查运行结果!

EXEC SP_execSQLonDB
'',           --没有表名条件,针对所有表
'%Name%',     --列名条件,列名包含“Name”字符串
'UPDATE @TABLENAME SET @COLUMNNAME = REPLACE(@COLUMNNAME,''Ltd.'',''LIMITED'')
        WHERE @COLUMNNAME LIKE ''%Ltd.''',        --UPDATE 语句
'N'           --不包含NTEXT,TEXT,IMAGE数据类型 

2、这个例子也在NORTHWIND数据库上执行
统计所有表中列名包含Name的列的值是“QUICK-Stop”的数量
create table ##TMP1 (table_name varchar(200),column_name varchar(200),rou_count int)
exec SP_execSQLonDB
'',
'%Name%',
'DECLARE @iCount as int
      SELECT @iCount=COUNT(1) FROM @TABLENAME WHERE @COLUMNNAME = ''QUICK-Stop''
      IF @iCount >0
                 INSERT INTO ##TMP1 SELECT ''@TABLENAME'',''@COLUMNNAME'',@iCount',
'N'
select * from ##TMP1

3、这个例子自己理解
针对所有以“EMPLOYEE”开头的表,以“DEPT”开头的字段执行存储过程。
EXEC SP_execSQLonDB
'EMPLOYEE%',
'DEPT%',
'EXEC USP_DeptStates ''@TABLENAME'',''@COLUMNNAME''',
'N'

4、还是自己理解
对@TABLENAME @COLUMNNAME参数给于多个值!
EXEC SP_execSQLonDB
'EMPLOYEE%,PF%',
'SALARY,%AMOUNT%',
'EXEC USP_EMPLOYEE_PF ',
'N'

 

 

JavaScript document 对表格内容搜索 模糊搜索 多个关键字搜索

作者:hyzhang 时间:2017-10-11 描述:document 搜索 模糊搜索 --> /*tr:hover{ color: yellow; }*/ ...
  • hyzhang6
  • hyzhang6
  • 2017年10月12日 10:07
  • 6170

MYSQL 多个DML语句同时提交

今天在编写对表结构修改的脚本时,没使用Navicat等客户端工具,而是直接使用mysql connect c++连接器,发现同时提交多个alter table语句时失败,改为一个一个地执行就没问题。该...
  • fengbangyue
  • fengbangyue
  • 2011年12月18日 16:37
  • 1134

多台应用同时操作一张表数据,解决并发问题

遇到的问题:多台应用部署调度任务,同时扫一张表的数据,并且对一张表的数据进行操作,可能出现的问题是一条数据被操作了两次,从而出现了并发性的问题。 解决办法:从sql上解决问题,并且限制查询条数。 ...
  • qq_37421862
  • qq_37421862
  • 2017年09月20日 16:13
  • 151

多线程并发同一个表问题

现有数据库开发过程中对事务的控制、事务锁、行锁、表锁的发现缺乏必要的方法和手段,通过以下手段可以丰富我们处理开发过程中处理锁问题的方法。 For Update和For Update of使用户能够锁...
  • aalansehaiyang52
  • aalansehaiyang52
  • 2011年09月12日 18:48
  • 1283

java Servlet操作多个mysql数据库

java Servlet操作多个mysql数据库
  • weixin_36751895
  • weixin_36751895
  • 2017年04月21日 12:34
  • 598

shell编程vim多个窗口操作

一、如果在终端中开没有打开vim,可以: 横向分割显示: $ vim -o filename1 filename2   纵向分割显示: $ vim -O filename1...
  • fortunate1y
  • fortunate1y
  • 2014年05月27日 13:23
  • 509

有关Access操作时出现“不能打开更多的表”的情况

Access数据库比较简单,不能打开太多的表。 OleDBDataReader reader使用完后一定要及时的关闭:reader.dispose();reader.close(); 否则当进行很多操...
  • Eric20080321
  • Eric20080321
  • 2009年04月02日 10:50
  • 684

同时操作两张表的数据,如何做到保证数据一致性

SpringMVC的控制层在同时操作两张表的数据时,应该把操作代码写到同一个Service方法里面...
  • outsider_lcg
  • outsider_lcg
  • 2016年07月29日 17:22
  • 2439

JDBC多表的CRUD操作

一、简介 Javaweb中开发中必然会有多个javabean对象,而对象之间必然会存在的关系。那么对象之间的关系在关系型数据库中,如MySql、Oracle、Sql Server数据库中是如何体...
  • chenshufei2
  • chenshufei2
  • 2012年10月18日 22:20
  • 1355

解决“提示错误: 无法对 表或索引视图'T_shili' 使用 CONTAINS 或 FREETEXT 谓词,因为它未编制全文索引。 ”

依据错误提示解决问题。 create table T_shili(id int not null, name varchar(10)) insert   T_shili select 1,'le...
  • sikaiyuan2008
  • sikaiyuan2008
  • 2012年08月18日 15:35
  • 7427
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何同时对多个表或列操作
举报原因:
原因补充:

(最多只允许输入30个字)