2017-02-02 47 views
0

我试图在Exec(@sqlstring)存储过程中将服务器名称作为变量传递。然而,我无法得到正确的语法,而且我几乎完全没有想法。服务器名称的变量语法

服务器名称是UK-DATA-SQL-P01或UK-DATA-SQL-P02,这就是为什么我需要将它用作变量,以便用户可以选择。

我试图用它来传递变量的语法是:

INNER JOIN ' + @ServerName + '.' + @DBName + '.[dbo]. 

我敢肯定,这是简单的,但任何帮助,将不胜感激。

在此先感谢

+0

我想补充我一直看到的错误是:附近有语法错误“1”。 – Carlos80

+0

正确,正如我在文章的第一行中提到的那样。 – Carlos80

+0

在这种情况下,我编辑了你的问题,以便清楚。你也应该在你的服务器和数据库名称周围加上'[]',就像你使用'dbo'一样。 – Igor

回答

0

使用这样的事情只是一个样本,那么你可以扩展

create proc sampleProc 
    @tableName varchar(100) , 
    @serverName varchar(100) 
    as 
    begin 

    declare @tableName1 varchar(100) 
    set @tableName1='Sales' 
    declare @fullname varchar(500) 

    set @fullname = @serverName+'.'+ @tableName 
    print (@fullname)  

    DECLARE @SQLQuery AS NVARCHAR(500) 

    SET @SQLQuery = ' SELECT * FROM '+ @fullname + ' inner join ' + @tableName1 + ' on id=custid' 

    print (@SQLQuery) 

    --EXECUTE(@SQLQuery) 

    end 


    --usage like this 
    exec sampleProc 'server','customer' 


    declare @tableName varchar(100) 
    set @tableName='Customers' 

    -- this is previous answer 

    declare @tableName1 varchar(100) 
    set @tableName1='Sales' 

    DECLARE @SQLQuery AS NVARCHAR(500) 

    SET @SQLQuery = ' SELECT * FROM '+ @tableName + ' inner join ' + @tableName1 + ' on id=custid' 

    print (@SQLQuery) 

    EXECUTE(@SQLQuery) 
+0

谢谢Yashveer,我该如何制作一个变量(@tableName)变量,因为用户有多个可以运行此报表的服务器? – Carlos80

+0

他的表名是变量,只需要在不同的服务器上执行时传递不同的名称,可能会在商店过程中使用。 –

+0

让我尝试将它添加到答案中。 –

0

您还可以使用OPENDATASOURCE。事情是这样的:

INNER JOIN OPENDATASOURCE('SQLOLEDB','Data Source = ServerName; User ID = Username; Password = Password').[DatabaseName].[DatabaseOwner].[TableName] Z ON...

PS。您需要启用Ad Hoc分布式查询才能正常工作。

How To Enable Ad Hoc Distributed Queries - 仅供参考

希望它能帮助。

0

我一直在使用别名来实现类似:

Create Procedure ReturnServerDbTable (@Server as nvarchar(50), @DB as nvarchar(50), @Table as nvarchar(50)) 
as 
begin 
declare @sql as nvarchar(500) 
set @sql = 'CREATE SYNONYM ServerDBTable FOR ' + @Server + '.' + @db + '.dbo.' + @table 
exec(@sql) 
select * from ServerDBTable 
DROP SYNONYM ServerDBTable 
end