[MS SQL]Cursor实例讲解1-对某个DB中所有的表加上一个字段
2014-01-13 15:12
453 查看
环境:SQLServer2008
由于增加了新功能,需要对原来的Database中所有的表加一个相同的字段,用来表示某记录的某种状态。而这个database中的表非常多,一个个去加,就显得很笨了,是吧?查了半天,终于用SQL写了一个循环,将这个功能实现了。
上面的tablename换成自己的表名,columnname换成自己的字段名即可。用中括号括上是为了避免和SQLServer的某些保留字冲突。
感兴趣的朋友可以用select*来看看都能取出什么字段,对应内容是什么,这句话可是相当有用的哦。
@@FETCH_STATUS
返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
0FETCH
语句成功(TheFETCHstatementwassuccessful.)。
-1FETCH
语句失败或此行不在结果集中(TheFETCHstatementfailedortherowwasbeyondtheresultset.)。
-2
被提取的行不存在(Therowfetchedismissing).
上面的[Lived]即为字段名。
到现在为止,就基本完成了我们想要的效果。
循环遍历某个database,对每个表进行添加[Lived]字段的操作,并将此表的所有记录的Lived初始化为1。完整代码如下:
更上一层楼
现在需求变了一点点。循环遍历某个Database,取出每个表的记录数,如果记录数为1,就打印出这个表名。
这里高级一点点的功能就是:执行selectcount(*)语句后,需要吧它记录在某个地方。下面先看完整代码:
大部分代码和上面是一样的。
这种情况下不能用EXEC()
要用sp_executesql才行,因为变量的生存期只在sql动态语句中,出了就无效了.用sp_executesql可以解决这个问题.因为可以传参数,可是EXEC()不能够传参数。
由于增加了新功能,需要对原来的Database中所有的表加一个相同的字段,用来表示某记录的某种状态。而这个database中的表非常多,一个个去加,就显得很笨了,是吧?查了半天,终于用SQL写了一个循环,将这个功能实现了。
1.首先我们需要将某个表加一个字段
这个字段名为Lived,对应SQL语句如下:altertabletablenameadd[columnname]int
上面的tablename换成自己的表名,columnname换成自己的字段名即可。用中括号括上是为了避免和SQLServer的某些保留字冲突。
2.在表中加上此字段后,我们需要将原有数据的Lived字段设为1
对应SQL语句如下:updatetablenameset[columname]=1
3.如何取出某个数据库中所有表名呢?
当然仅限于我们自己创建的表,而不是系统表.用下面SQL语句就可以了.selectnamefromsysobjectswherextype='u'
感兴趣的朋友可以用select*来看看都能取出什么字段,对应内容是什么,这句话可是相当有用的哦。
4.接着就是SQL语句如何循环呢?
现在我们已经可以取到某个database中所有用户表,如何循环对每个表进行操作呢?declaretnames_cursorCURSOR
FOR
selectnamefromsysobjectswherextype='u'
OPENtnames_cursor
DECLARE@tablesysname
FETCHNEXTFROMtnames_cursorINTO@table
while(@@FETCH_STATUS<>-1)
begin
IF(@@FETCH_STATUS<>-2)
BEGIN
--在这里写上你对每个表的操作
END
FETCHNEXTFROMtnames_cursorINTO@table
end
CLOSEtnames_cursor
DEALLOCATEtnames_cursor
@@FETCH_STATUS
返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
0FETCH
语句成功(TheFETCHstatementwassuccessful.)。
-1FETCH
语句失败或此行不在结果集中(TheFETCHstatementfailedortherowwasbeyondtheresultset.)。
-2
被提取的行不存在(Therowfetchedismissing).
5.现在就剩最后一个问题了。如何在循环中执行SQL语句呢?
很简单,用exec就可以。如下:EXEC('altertable'+@table+'add[Lived]int')
EXEC('Update'+@table+'set[Lived]=1')
上面的[Lived]即为字段名。
到现在为止,就基本完成了我们想要的效果。
循环遍历某个database,对每个表进行添加[Lived]字段的操作,并将此表的所有记录的Lived初始化为1。完整代码如下:
usedatabasename
go
declaretnames_cursorCURSOR
FOR
selectnamefromsysobjectswherextype='u'
OPENtnames_cursor
DECLARE@tablesysname
FETCHNEXTFROMtnames_cursorINTO@table
while(@@FETCH_STATUS<>-1)
begin
IF(@@FETCH_STATUS<>-2)
BEGIN
EXEC('altertable'+@table+'add[Lived]int')
EXEC('Update'+@table+'set[Lived]=1')
print'altertable'+@table+'add[Lived]int'
END
FETCHNEXTFROMtnames_cursorINTO@table
end
CLOSEtnames_cursor
DEALLOCATEtnames_cursor
更上一层楼
现在需求变了一点点。循环遍历某个Database,取出每个表的记录数,如果记录数为1,就打印出这个表名。
这里高级一点点的功能就是:执行selectcount(*)语句后,需要吧它记录在某个地方。下面先看完整代码:
usedatabasename
go
declaretnames_cursorCURSOR
FOR
selectnamefromsysobjectswherextype='u'
OPENtnames_cursor
DECLARE@tablesysname
DECLARE@numint,@sqlsnvarchar(4000)
FETCHNEXTFROMtnames_cursorINTO@table
while(@@FETCH_STATUS<>-1)
begin
IF(@@FETCH_STATUS<>-2)
BEGIN
set@sqls='select@a=count(*)FROM'+@table
execsp_executesql@sqls,N'@aintoutput',@numoutput
if(@num=1)
BEGIN
print@table
END
END
FETCHNEXTFROMtnames_cursorINTO@table
end
CLOSEtnames_cursor
DEALLOCATEtnames_cursor
大部分代码和上面是一样的。
这种情况下不能用EXEC()
要用sp_executesql才行,因为变量的生存期只在sql动态语句中,出了就无效了.用sp_executesql可以解决这个问题.因为可以传参数,可是EXEC()不能够传参数。
相关文章推荐
- [MS SQL]Cursor实例讲解2-对某个DB中所有的表删除指定字段
- 通过一个实例,讲解java 中的类、方法和字段
- JAVA 反射获取一个实例的所有字段值
- Sql查询一个表中除了某个字段以外的所有字段的方法
- 把一个select查询结果插入到一个表(可选指定字段和值实例)
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
- 一个记录集,如何得到该记录集中某一字段所有是重复记录的记录集
- XHTML 的一个实例, 其实这个实例的方法已经可以实现所有要实现的布局. by Emerald 绿色学院 - Green Institute
- 获取一个数据库所有表的字段详细情况(邹建写的)
- Android 动画效果 --Animation 动画(讲解了所有的Android动画效果,是一个值得收藏的帖子)
- iOS开发中实现一个简单的图片浏览器的实例讲解
- 遍历一个实例的所有属性,得到属性的名称和值
- mysql更新一个表里的字段等于另一个表某字段的值实例
- SQL 查询一个字段所有的之出现次数大于等于2的条数
- 取得MS SQL 2000数据库一个表的所有列名
- Sharepoint 2010 获取一个列表的所有字段,并转换成SQL语句
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 获得一个表的所有字段名
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- mysql中查询实例中不包含3个字段所有表