解决方案 »

  1.   

    用use 改为数据不行,建议你在查询或更新sql语句,前面加上:数据库名.dbo.表,这样的方法最可靠
      

  2.   


    use [master]
    go
    declare @dbname varchar(20),@sql1 varchar(100)
    set @dbname='db201301'
    set @sql1 = 'use '+@dbname
    exec @sql1
    go
    declare @tname varchar(20),@num int,@sql2
    set @tname='db201301'
    set @sql2='select @a=COUNT(*) from '+@tname+'.dbo.type'
    exec sp_executesql @sql2,N'@a int output',@num output
    select @num
      

  3.   

    这个方法由于 数据库名是个变量 
    所以只能写成
    exec(select count(*) from '+@dbname+'.dbo.type')
    问题是我的语句不止有更新和查询,还有其他的变量
    比如这样 
    declare @tname varchar(20),@num int
    set @tname='db201301'
    exec('select @num=COUNT(*) from '+@tname+'.dbo.type')
    select @num
    这种情况  @num根本得不到值,而且报错
      

  4.   


    declare @tname varchar(20),@num int
    set @tname='db201301'
    declare @sql Nvarchar(1000)=N'select @num=COUNT(*) from '+@tname+'.dbo.type';
    Exec sp_executesql @sql,N'@num int output',@num output
    select @num可以用这种方式
      

  5.   

    那就把所有的处理语句都写在exec中
    exec('use ['+@dbname+'] declare @num int select @num =count(*) from Table_1 select @num')
    动态生成整个的执行sql
      

  6.   

    use关键字是无法在语句和存储过程中存在,只能是在SSMS上面可以使用。所以,你只能用完整的对象名:数据库名.架构名.表名
      

  7.   

    这个写法能达到了我的目的,虽然会将整个存储过程变的更加臃肿,难道这个就是人生吗?
    有没有变相实现use 数据库 的办法,真不想拼sql。 
      

  8.   

    是啊。。if语句也写到exec里啊
      

  9.   

    是啊。。if语句也写到exec里啊
    这样写的话,我觉的好恐怖啊,if里面可是一大堆语句块,都写在一个字符串里面..没准那里错了,找都找不到。