我在我的sql server 2008中添加了一个链接服务器。我想从一个表和一个驻留在我的链接服务器上的表值函数中获取数据,并按照下面给出的命名约定将这些数据连接到本地表。
import { a, deeper, changeA } from './b';
console.log(a); // 1
changeA();
console.log(a); // Expected 2 but get 1
console.log(deeper.a); // prints 2 as expected
但是我的第一个问题是我需要从表中获取<server>.<database>.<schema>.<table>
部分。所以,当我尝试做类似跟随它失败的事情时
<server>
任何想法如何用用户定义的变量形成完全限定的链接服务器表名?
我的SP如下
Select * FROM @ServerNameVariable.database.dbo.myTable
答案 0 :(得分: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&gt; 0)。
编辑1:在SQL注入的段落中添加了更多细节。
编辑2:根据@TTs评论,从第二个示例查询中删除方括号,替换为QUOTENAME。
答案 1 :(得分:2)
使用链接服务器的名称,它将是一个4部分限定符,例如
Select * From [Link Server Name ].[Database].[Schema].[Table]