http://topic.csdn.net/t/20021222/22/1288943.html

解决方案 »

  1.   

    --参考:--使用游标在数据库的所有表里查某个值declare @str varchar(100) 
    set @str = 'str'  --要搜索的字符串 declare @s varchar(8000) 
    declare tb cursor local for 
    select s = 'if exists(select 1 from [' + b.name + '] where convert(varchar,[' + a.name + ']) like ''%' + @str + '%'') 
    print ''select top 5 [' + a.name + '],* from [' + b.name + ']''' 
    from syscolumns a join sysobjects b on a.id = b.id 
    where b.xtype = 'U' and a.status >= 0 
    --所查列的字段类型 
    and a.xusertype in(175,239,231,167,56,60,108,106) 
    open tb 
    fetch next from tb into @s 
    while @@fetch_status = 0 
    begin 
    exec(@s) 
    fetch next from tb into @s 
    end 
    close tb 
    deallocate tb 
      

  2.   

    DECLARE CURSOR
    定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。SQL-92 语法
    DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
    FOR select_statement 
    [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]Transact-SQL 扩展语法
    DECLARE cursor_name CURSOR 
    [ LOCAL | GLOBAL ] 
    [ FORWARD_ONLY | SCROLL ] 
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
    [ TYPE_WARNING ] 
    FOR select_statement 
    [ FOR UPDATE [ OF column_name [ ,...n ] ] ]SQL-92 参数
    cursor_name是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。INSENSITIVE定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。SCROLL指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。select_statement是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。如果 select_statement 中的子句与所请求的游标类型的功能发生冲突,则 Microsoft® SQL Server™ 隐性地将游标转换为另一种类型。有关更多信息,请参见隐性游标转换。READ ONLYPrevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。UPDATE [OF column_name [,...n]]定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。Transact-SQL 扩展参数
    cursor_name是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。LOCAL指定该游标的作用域对在其中创建它的批处理、存储过程或触发器是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量指派参数使其引用游标。除非 OUTPUT 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐性释放。如果 OUTPUT 参数将游标传递回来,游标在最后引用它的变量释放或离开作用域时释放。GLOBAL指定该游标的作用域对连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在脱接时隐性释放。说明  如果 GLOBAL 和 LOCAL 参数都未指定,则默认值由 default to local cursor 数据库选项的设置控制。在 SQL Server 7.0 版中,该选项默认为 FALSE 以与 SQL Server 早期版本相匹配,在 SQL Server 早期版本中所有游标都是全局的。该选项的默认值在以后的 SQL Server 版本中可能会更改。有关更多信息,请参见设置数据库选项。
    FORWARD_ONLY指定游标只能从第一行滚动到最后一行。FETCH NEXT 是唯一受支持的提取选项。如果在指定 FORWARD_ONLY 时不指定 STATIC、KEYSET 和 DYNAMIC 关键字,则游标作为 DYNAMIC 游标进行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定,除非指定 STATIC、KEYSET 或 DYNAMIC 关键字,否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO这类数据库 API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。STATIC定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。KEYSET指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过 Transact-SQL 服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新,则新值可视。DYNAMIC定义一个游标,以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。FAST_FORWARD指定启用了性能优化的 FORWARD_ONLY、READ_ONLY 游标。如果指定 FAST_FORWARD,则不能也指定 SCROLL 或 FOR_UPDATE。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。READ_ONLY禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。SCROLL_LOCKS指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时,Microsoft® SQL Server™ 会锁定这些行。如果还指定了 FAST_FORWARD,则不能指定 SCROLL_LOCKS。OPTIMISTIC指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反,SQL Server 使用 timestamp 列值的比较,或者如果表没有 timestamp 列则使用校验值,以确定将行读入游标后是否已修改该行。如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了 FAST_FORWARD,则不能指定 OPTIMISTIC。TYPE_WARNING指定如果游标从所请求的类型隐性转换为另一种类型,则给客户端发送警告消息。select_statement是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。如果 select_statement 内的子句与所请求的游标类型冲突,SQL Server 将游标隐性转换成另一种类型。有关更多信息,请参见隐性游标转换。UPDATE [OF column_name [,...n]]定义游标内可更新的列。如果提供了 OF column_name [,...n],则只允许修改列出的列。如果在 UPDATE 中未指定列的列表,除非指定了 READ_ONLY 并发选项,否则所有列均可更新。注释
    DECLARE CURSOR 定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。OPEN 语句填充结果集,FETCH 从结果集返回行。CLOSE 语句释放与游标关联的当前结果集。DEALLOCATE 语句释放游标所使用的资源。DECLARE CURSOR 语句的第一种格式使用 SQL-92 语法声明游标行为。DECLARE CURSOR 的第二种格式使用 Transact-SQL 扩展,使您得以使用在 ODBC、ADO 和 DB-Library的数据库 API 游标函数中的相同游标类型定义游标。不能混淆这两种格式。如果在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE 关键字,则不能在 CURSOR 和 FOR select_statement 关键字之间使用任何关键字。如果在 CURSOR 和 FOR select_statement 关键字之间指定任何关键字,则不能在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE。如果使用 Transact-SQL 语法的 DECLARE CURSOR 不指定 READ_ONLY、OPTIMISTIC 或 SCROLL_LOCKS,则默认设置如下: 如果 SELECT 语句不支持更新(权限不够,访问的远程表不支持更新,等等),则游标是 READ_ONLY。
    STATIC 和FAST_FORWARD 游标默认为 READ_ONLY。
    DYNAMIC 和 KEYSET 游标默认为 OPTIMISTIC。 
    游标名称只能由其它 Transact-SQL 语句引用,不能由数据库 API 函数引用。例如,在声明游标后,不能从 OLE DB、ODBC、ADO 或 DB-Library 函数或方法引用游标名称。游标行不能通过 API 提取函数或方法提取,而只能由 Transact-SQL FETCH 语句提取。在声明游标后,可使用下列系统存储过程确定游标的特性。系统存储过程 描述 
    sp_cursor_list 返回当前在连接上可视的游标列表及其特性。 
    sp_describe_cursor 描述游标特性,比如是只进游标还是滚动游标。 
    sp_describe_cursor_columns 描述游标结果集中的列的特性。 
    sp_describe_cursor_tables 描述游标所访问的基表。 
    变量可作为声明游标的 select_statement 的一部分使用。然而,在游标声明之后对那些变量的更改将不会对游标的操作产生影响。权限
    默认情况下,将 DECLARE CURSOR 权限授予对游标中所使用的视图、表和列有 SELECT 权限的任何用户。示例
    A. 使用简单游标和语法
    打开该游标时所生成的结果集包括 pubs 数据库的 authors 表中的所有行和列。可以更新该游标,对该游标所做的所有更新和删除均在提取中表现出来。因为没指定 SCROLL 选项,FETCH NEXT 是唯一可用的提取选项。DECLARE authors_cursor CURSOR
       FOR SELECT * FROM authors
    OPEN authors_cursor
    FETCH NEXT FROM authors_cursorB. 使用嵌套游标生成报表输出
    下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。SET NOCOUNT ONDECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
       @message varchar(80), @title varchar(80)PRINT "-------- Utah Authors report --------"DECLARE authors_cursor CURSOR FOR 
    SELECT au_id, au_fname, au_lname
    FROM authors
    WHERE state = "UT"
    ORDER BY au_idOPEN authors_cursorFETCH NEXT FROM authors_cursor 
    INTO @au_id, @au_fname, @au_lnameWHILE @@FETCH_STATUS = 0
    BEGIN
       PRINT " "
       SELECT @message = "----- Books by Author: " + 
          @au_fname + " " + @au_lname   PRINT @message   -- Declare an inner cursor based   
       -- on au_id from the outer cursor.   DECLARE titles_cursor CURSOR FOR 
       SELECT t.title
       FROM titleauthor ta, titles t
       WHERE ta.title_id = t.title_id AND
       ta.au_id = @au_id   -- Variable value from the outer cursor   OPEN titles_cursor
       FETCH NEXT FROM titles_cursor INTO @title   IF @@FETCH_STATUS <> 0 
          PRINT "         <<No Books>>"        WHILE @@FETCH_STATUS = 0
       BEGIN
          
          SELECT @message = "         " + @title
          PRINT @message
          FETCH NEXT FROM titles_cursor INTO @title
       
       END   CLOSE titles_cursor
       DEALLOCATE titles_cursor
       
       -- Get the next author.
       FETCH NEXT FROM authors_cursor 
       INTO @au_id, @au_fname, @au_lname
    ENDCLOSE authors_cursor
    DEALLOCATE authors_cursor
    GO-------- Utah Authors report --------
     
    ----- Books by Author: Anne Ringer
             The Gourmet Microwave
             Is Anger the Enemy?
     
    ----- Books by Author: Albert Ringer
             Is Anger the Enemy?
             Life Without Fear
      

  3.   

    SQL还原数据库后孤立用户问题处理所谓孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录孤立帐户的产生一般是一下两种:
    1.将备份的数据库在其它机器上还原;
    2.重装系统或SQL SERVER之后只还原了用户库解决方法是使用sp_change_users_login来修复sp_change_users_login的用法有三种用法1:
    exec sp_change_users_login 'REPORT'列出当前数据库的孤立用户用法2:
    exec sp_change_users_login 'AUTO_FIX','用户名'可以自动将用户名所对应的同名登录添加到syslogins中用法3:
    exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'
    将用户名映射为指定的登录名 
    ----------------------------------------------------------------------------------------------------------------
    看看是否有用
    SQL孤立用户解决方案  
    症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤本文介绍了如何解决孤立用户问题状态Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题更多信息虽然术语登录和用户经常交换使用,但它们之间有很大的不同登录用于用户身份验证,而数据库用户帐户用于数据库访问和权限验证登录通过安全识别符 (SID) 与用户关联访问 SQL Server 服务器需要登录验证特定登录是否有效的过程称为身份验证登录必须与 SQL Server 数据库用户相关联您使用用户帐户控制数据库中执行的活动如果数据库中不存在针对特定登录的用户帐户,使用该登录的用户即使能够连接到 SQL Server 服务器,也无法访问数据库但是,该情形的唯一例外是当数据库包含guest用户帐户时与用户帐户不关联的登录将被映射到 guest 用户相反,如果存在数据库用户,但没有与其关联的登录,则该用户将无法登录到 SQL Server 服务器中将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户这种情况被称为存在孤立用户孤立用户疑难解答当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题以下情形说明了该问题并阐述如何加以解决1. 向主数据库添加一个登录,并将默认数据库指定为 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'2. 向刚创建的用户授予访问权限: Use Northwind go sp_grantdbaccess 'test'3. 备份数据库 BACKUP DATABASE Northwind
    TO DISK = 'C:MSSQLBACKUPNorthwind.bak'4. 将数据库恢复到其他 SQL Server 服务器: RESTORE DATABASE Northwind
    FROM DISK = 'C:MSSQLBACKUPNorthwind.bak'
          
    恢复的数据库包含名为test的用户,但没有相应的登录,这就导致test成为孤立用户 
    5. 现在,为了检测孤立用户,请运行此代码: Use Northwind go sp_change_users_login 'report'
          
    输出中列出了所有登录,其中包含 Northwind 数据库的 sysusers 系统表和主数据库的 sysxlogins 系统表中不匹配的条目解决孤立用户问题的步骤1. 为前一步中的孤立用户运行以下命令:Use Northwind
    go
    sp_change_users_login 'update_one', 'test', 'test'
          
    这样,就将服务器登录test与 Northwind 数据库用户test重新连接起来sp_change_users_login 存储过程还可以使用auto_fix参数对所有孤立用户执行更新,但不推荐这样做,因为 SQL Server 会尝试按名称匹配登录和用户大多数情况下这都是可行的;但是,如果用户与错误登录关联,该用户可能拥有错误的权限2. 在上一步中运行代码后,用户就可以访问数据库了然后用户可以使用 sp_password 存储过程更改密码: Use master
    go
    sp_password NULL, 'ok', 'test'
          
    此存储过程不能用于 Microsoft Windows NT 安全帐户通过 Windows NT 网络帐户连接到 SQL Server 服务器的用户是由 Windows NT 授权的;因此,这些用户只能在 Windows NT 中更改密码只有 sysadmin 角色的成员可以更改其他用户的登录密码 
    ----------------------------------------------------------------------------------------------------------------SQL2005删除用户的时候,产生数据库主体在该数据库中拥有架构,无法删除的解决办法--执行如下SQL语句ALTER   AUTHORIZATION   ON   SCHEMA::db_owner   TO   dbo; 
    --然后手动删除就可以了
    ----------------------------------------------------------------------------------------------------------------
    [导入]sql2000备份的数据库还原到sql2005后,选择数据库关系图提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法 
    sql2000备份的数据库还原到sql2005后,选择数据库关系图提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象若要继续,请首先使用数据库属性对话框的文件页或 ALTER AUTHORIZATION 语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象 
         
    解决方法如下: 
    1设置兼容级别为90(2005为90) 
    USE [master] 
    GO 
    EXEC dbo.sp_dbcmptlevel @dbname='数据库名', @new_cmptlevel=90 
    GO  或是选责你还原的数据库,点右键,选属性->选项->兼容级别,选择sqlserver2005(90) 然后确定,      这时,你在该数据库下展开数据库关系图节点时会有个提示,"此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建",选择是即可2通过以上的方法操作,如果问题依然存在的话,按下列方法继续选择你的数据库,然后选择"安全性"->"用户",选择dbo,打开属性页,如登录名为空的话,新建查询,然后use [你的数据库名]
    EXEC   sp_changedbowner   'sa' 执行成功后,你再选择"数据库关系图"节点,时提示 此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建",选择是即可 就可以看到原先建的关系图了
    ----------------------------------------------------------------------------------------------------------------从服务器上作导入导出至本地机上,数据库中的表都在,可是表名前段的架构身份不是dbo了,而是服务器上数据库的库名这样架构身份不同了,程序运行就出问题了试过单个修改表,在sql2005的属性窗口可以更改架构者,可是N多表哪儿能手动改得过来呀!还请高手指点批量更改的方法在此谢过 
    SQL   Server2005可以使用系统存储过程sp_changeobjectowner更改数据库对象的所有者   
        
    sp_changeobjectowner   '对象名(包括架构名)','新架构名'   
        
    批量修改请用:   
        
    方法一:使用游标   
        
    declare   @name   sysname   
    declare   csr1   cursor   
    for     
          select   TABLE_NAME   from   INFORMATION_SCHEMA.TABLES   
    open   csr1   
        
    FETCH   NEXT   FROM   csr1   INTO   @name   
    while   (@@FETCH_STATUS=0)   
          BEGIN   
    SET   @name='原架构名.'+@name   
                      EXEC   SP_ChangeObjectOwner   @name,   '新架构名'   
        fetch   next   from   csr1   into   @name   
          END   
    CLOSE   csr1   
    DEALLOCATE   csr1   
        
    方法二:使用系统存储过程sp_MSforeachtable   
    EXEC   sp_MSforeachtable   @command1="EXEC   SP_ChangeObjectOwner   '?','新架构名'"
    ----------------------------------------------------------------------------------------------------------------
    在sql server 2005数据库中更改数据架构 
    在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改为B,同时删除用户A;架构也由A改为B,删除架构A,操作如下:1创建用户B,再创建架构B;
    2将架构A的权限赋给用户B,取消用户A拥有架构A的权限,删除用户A;
    3将数据库的所有属于架构A的对象改为架构B,代码如下:
    ALTER SCHEMA [新架构名] TRANSFER 旧架构名.[数据库中的对象表或视图或存储过程]ALTER SCHEMA [B] TRANSFER A.[对象1]
    ALTER SCHEMA [B] TRANSFER A.[对象2]
    ALTER SCHEMA [B] TRANSFER A.[对象n]
    4删除架构A
     
      

  4.   

    兄弟们还是不行啊.我发现我现在无论在哪个库里建个带游标的存储过程全跑不起来,都说游标不存在..哎..
    系统master库都都不不了游标了..我恢复的可只有我自已的数据库A啊.没有恢复过master之类的.
    我检查过楼上的:
    所谓孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录执行了下:exec sp_change_users_login 'REPORT'
    什么都没出来...我现在是syslogins表里记录一堆,但sysusers表中不一定有东西和它对应,应该用sid对应的吧.反正就是不一定有东西对应,不过和楼上说的是相反的情况.
    后来新建了个登录用户,还给了它权限,结果用它登录后来跑带游标存储过程还是报这个错..