2016-01-05 139 views
3

我在我的sql server 2008中添加了一个链接的服务器。我想从一个表和一个表值函数中获取数据驻留在我的链接服务器上,并通过以下方式将其添加到本地表中:低于给定的命名约定。SQL Server链接服务器加入

<server>.<database>.<schema>.<table> 

但是,我的第一个问题是我需要从表中获取<server>部分。所以,当我尝试这样做以下失败

Select * FROM @ServerNameVariable.database.dbo.myTable 

任何想法,我怎么能与一个用户定义的变量完全合格的链接服务器的表名?

我的SP是如下

CREATE PROCEDURE TEST_SP  
AS 
BEGIN 
    DECLARE @NetworkDBName VARCHAR(255) 
    SET @NetworkDBName = '[MyLinkedServerName]' 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    select * from @NetworkDBName + '.' + testDatabase.dbo.Invoice_tb 
END 
GO 
+3

你不需要'@'。 –

+2

'SELECT name FROM sys.servers WHERE server_id> 0' - 您的链接服务器 – Devart

+0

但'@'必须在用户定义的变量之前使用,否则SP将无法编译 – ItsZeus

回答

5

不能到位的数据库,模式或表名使用变量。

您可以使用sp_ExecuteSQL来构建和执行动态SQL语句。

此示例不起作用,因为服务器名称被视为字符串而不是服务器对象。

失败实施例

/* Anti-pattern. 
* Does not work. 
*/ 
DECLARE @Server SYSNAME = 'Server001'; 

SELECT 
    * 
FROM 
    @Server.Database1.dbo.Table1 
; 

这个例子表明,不工作的方法。这里的SQL语句被构建为一个字符串,然后执行。

/* Dynamic SQL statement. 
* Will work. 
*/ 
DECLARE @Server SYSNAME = 'Server001'; 
DECLARE @Statement NVARCHAR(255); 

SET @Statement = 'SELECT * FROM ' + QUOTENAME(@Server) + '.Database1.dbo.Table1;'; 

EXECUTE sp_ExecuteSQL @Statement; 

一如既往;生成和执行动态SQL语句时请小心。你不想打开自己达到SQL injection攻击。查看OPENROWSET或根据上面@Devart提供的代码(SELECT name FROM sys.servers WHERE server_id> 0)检查传递的服务器名称,然后执行。

编辑1:增加了关于SQL注入段落的更多细节。

编辑2:根据@TTs注释从第二个示例查询中删除了方括号,用QUOTENAME替换。

+2

而不是使用矩形括号手动封装服务器名(或数据库,表名等),请使用['QUOTENAME函数'](https://msdn.microsoft.com/nl-be/库/ ms176114.aspx)。如果名称包含矩形括号,该函数将正确地转义。 –

+0

你的答案是非常详细的,我很感激。然而事情是服务器名称保存在数据库中。其次,我需要使用结果集加入到本地表中,该表构成了我需要的数据 – ItsZeus

+0

重新加入:您仍然可以执行此操作。我越想越多,我更喜欢[OPENROWSET](https://msdn.microsoft.com/zh-cn/library/ms190312.aspx)方法。如果你遵循MSDN的链接,它包含一个INNER JOIN的例子。 sp_ExecuteSQL可以达到相同的结果,你只需要添加连接和本地表名。重新命名保存在分贝:我不知道我明白这一点。你能详细说明吗? –

2

使用链接服务器的名称,它将4部分的预选赛e.g

Select * From [Link Server Name ].[Database].[Schema].[Table]