动态使用USE,只能在动态执行的时候起作用,执行完毕就恢复原来。
可以这样,将后面的工作一并执行:
set @sql = 'use ' + @databasename+ ' select * from yourtable'
exec (@sql)

解决方案 »

  1.   

    declare @sql char(13)
    declare @databasename char(6)
    set @databasename = 'mybase' set @sql = 'use ' + @databasename
    exec (@sql)------ Transact-SQL 参考  
    USE
    将数据库上下文更改为指定数据库。语法
    USE { database }参数
    数据库是用户上下文要切换到的数据库的名称。数据库名称必须符合标识符的规则。注释
    USE 在编译和执行期间均可执行,并且立即生效。因此,出现在批处理中 USE 语句之后的语句将在指定数据库中执行。用户在登录到 Microsoft® SQL Server™ 时,通常被自动连接到 master 数据库。除非为每个用户的登录 ID 设置了各自的默认数据库,每个用户都必须执行 USE 语句从 master 切换到另一个数据库。若要将上下文更改为不同的数据库,用户必须有那个数据库的安全帐户。由数据库所有者提供此数据库的安全帐户。权限
    USE 权限默认授予那些由执行 sp_adduser 的 dbo 和 sysadmin 固定服务器角色,或由执行 sp_grantdbaccess 的 sysadmin 固定服务器角色以及 db_accessadmin 和 db_owner 固定数据库角色指派了权限的用户。如果目的数据库中存在来宾用户,则在该数据库中没有安全帐户的用户依然可以访问。
    请参见CREATE DATABASEDROP DATABASEEXECUTEsp_addaliassp_adduser sp_defaultdb使用标识符©1988-2000 Microsoft Corporation。保留所有权利。
      

  2.   

    或者不使用USE,直接使用数据库名称:
    set @sql =  'select * from '+@databasename+'.dbo.yourtable'
    exec (@sql)
      

  3.   

    我早就试过如下:
    declare @sql char(13)
    declare @databasename char(6)
    set @databasename = 'mybase' 
    set @sql = 'use ' + @databasename
    exec (@sql)
    可以运行,但结果是没有任何效果,相当于没有执行。
    所以我一般用下面这种:
    set @sql =  'select * from '+@databasename+'.dbo.yourtable'
    exec (@sql)