我试图在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