我試圖在Exec(@sqlstring)
存儲過程中將服務器名稱作爲變量傳遞。然而,我無法得到正確的語法,而且我幾乎完全沒有想法。服務器名稱的變量語法
服務器名稱是UK-DATA-SQL-P01或UK-DATA-SQL-P02,這就是爲什麼我需要將它用作變量,以便用戶可以選擇。
我試圖用它來傳遞變量的語法是:
INNER JOIN ' + @ServerName + '.' + @DBName + '.[dbo].
我敢肯定,這是簡單的,但任何幫助,將不勝感激。
在此先感謝
我試圖在Exec(@sqlstring)
存儲過程中將服務器名稱作爲變量傳遞。然而,我無法得到正確的語法,而且我幾乎完全沒有想法。服務器名稱的變量語法
服務器名稱是UK-DATA-SQL-P01或UK-DATA-SQL-P02,這就是爲什麼我需要將它用作變量,以便用戶可以選擇。
我試圖用它來傳遞變量的語法是:
INNER JOIN ' + @ServerName + '.' + @DBName + '.[dbo].
我敢肯定,這是簡單的,但任何幫助,將不勝感激。
在此先感謝
使用這樣的事情只是一個樣本,那麼你可以擴展
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)
謝謝Yashveer,我該如何製作一個變量(@tableName)變量,因爲用戶有多個可以運行此報表的服務器? – Carlos80
他的表名是變量,只需要在不同的服務器上執行時傳遞不同的名稱,可能會在商店過程中使用。 –
讓我嘗試將它添加到答案中。 –
您還可以使用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 - 僅供參考
希望它能幫助。
我一直在使用別名來實現類似:
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
我想補充我一直看到的錯誤是:附近有語法錯誤「1」。 – Carlos80
正確,正如我在文章的第一行中提到的那樣。 – Carlos80
在這種情況下,我編輯了你的問題,以便清楚。你也應該在你的服務器和數據庫名稱周圍加上'[]',就像你使用'dbo'一樣。 – Igor