zoukankan      html  css  js  c++  java
  • 游标那点事儿

    两种循环跳出方法

    1:稍显复杂点:

    CREATE  PROCEDURE dbo.usp_crAllTables

    @Client_ID VARCHAR(256)
    AS
    DECLARE @table_name VARCHAR(50)
    SET NOCOUNT ON 
    DECLARE T_Name_Cur CURSOR LOCAL STATIC FORWARD_ONLY FOR 
    SELECT name FROM 
    (VALUES ('Jim'),('Tom'),('Anna')) AS a (name)
    OPEN T_Name_Cur 
    WHILE 1=1
    BEGIN 
    FETCH NEXT FROM T_Name_Cur INTO @table_name
    IF @@FETCH_STATUS<>0 BREAK
    PRINT @table_name
    END 
    CLOSE T_Name_Cur

    DEALLOCATE T_Name_Cur


    重点在于break放置位置,避免重复取最后一行,这两种方法的print那里就是我们想要循环执行东东的地方。


    2.直接用@@fetch_status 作为循环终止条件

    SET NOCOUNT ON
    DECLARE T_Name_Cur CURSOR LOCAL STATIC FORWARD_ONLY FOR
    SELECT name FROM
    (VALUES ('Jim'),('Tom'),('Anna')) AS a (name)
    OPEN T_Name_Cur
    FETCH NEXT FROM T_Name_Cur INTO @table_name
    WHILE (@@fetch_status=0)
    BEGIN
    PRINT @table_name
    FETCH NEXT FROM T_Name_Cur INTO @table_name
    END
    CLOSE T_Name_Cur
    DEALLOCATE T_Name_Cur
    需要记得想要在循环内执行的东西要放到两个fetch next之间才好。


    实践,游标加上动态SQL 实现对某表的所有字段进行更新的操作

    CREATE PROCEDURE Clean_up_raw_tables 
    @Table_Name VARCHAR(256) 
    as 
    DECLARE @NAME VARCHAR(256), 
    @SQL VARCHAR(MAX) 
    DECLARE RE_CUR CURSOR LOCAL STATIC FORWARD_ONLY FOR 
    SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID(@Table_Name) AND NAME!='ID' 

    OPEN RE_CUR 
    WHILE (1=1) 
    BEGIN 
    FETCH NEXT FROM RE_CUR INTO @NAME 
    IF @@FETCH_STATUS<>0 BREAK 
    SET @SQL='UPDATE '+@Table_Name+' SET '+@NAME+'=REPLACE('+@NAME+',''"'','''')' 
    PRINT @SQL 
    EXEC(@SQL) 
    END 
    CLOSE RE_CUR 
    DEALLOCATE RE_CUR


    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    nodeJs-querystring 模块
    nodeJs-process对象
    nodejs-Path模块
    nodejs-os模块
    nodejs-CommonJS规范
    nodejs-Events模块
    nodejs-Http模块
    nodejs-Cluster模块
    转:AOP与JAVA动态代理
    转:jdk动态代理实现
  • 原文地址:https://www.cnblogs.com/Frank99/p/5400014.html
Copyright © 2011-2022 走看看