2017-02-02 51 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