如以下例子:
declare @sqltcolde varchar(8000),@linkip varchar(300),
        @locldb varchar(8000)set @linkip='192.168.18.20' 
if exists(select * from master.dbo.sysservers where srvname='linkremote' )
   begin
     Exec sp_droplinkedsrvlogin linkremote,Null
     Exec sp_dropserver linkremote
   endEXEC  sp_addlinkedserver
      @server='linkremote',--被访问的服务器别名
      @srvproduct='',
      @provider='SQLOLEDB',
      @datasrc=@linkip   --要访问的服务器
EXEC sp_addlinkedsrvlogin 
     'linkremote', --被访问的服务器别名
     'false', 
     NULL, 
     'sa', --帐号
     '123' --密码select @locldb=db_name()  ---取当前的数据库名称select *  
FROM openquery(linkremote,'select * from cy302ncs.dbo.t_codes')  这样最后结果可以查询远端数据库表t_codes的数据,因为数据库名“cy302ncs”是动态的,我就把下面改了一下语句:
select *  
FROM openquery(linkremote,'select * from '+@locldb+'.dbo.t_codes') 报错,是语法错误,请问如何能实现数据库名是动态的写法?

解决方案 »

  1.   

    exec('select *   
    FROM openquery(linkremote,''select * from '+@locldb+'.dbo.t_codes''')  
      

  2.   


    DECLARE @sql nvarchar(1200)
    begin
    SELECT @sql = 'select *   
    FROM openquery(linkremote,select * from ' + @locldb+ '.dbo.t_codes)'EXECUTE(@sql)
    end
      

  3.   

     感觉好像不用动态 sql 也行啊,是你写错了名称或者类型吧 动态 sql 可以如下
     declare @sql 
     set @sql = ' select *   FROM openquery(linkremote,''select * from '  
                 + @locldb +'.dbo.t_codes'') ' exec(@sql)