在链接服务器上运行内置函数

Gre*_*reg 5 sql-server linked-server functions sql-server-2014

我们有两台 SQL 2014 服务器,我在其中一台上创建了一个链接服务器到另一台上。作为我尝试运行的任务的一部分,我需要将 SQL 用户 ID 转换为本地和链接服务器上的用户名。

在本地服务器上,我可以调用

SELECT SUSER_NAME(1)
Run Code Online (Sandbox Code Playgroud)

这将返回字符串 sa

是否有一种简单的方法可以SUSER_NAME在链接服务器上运行该函数以从那里获取值?

我认为我发现的另一种选择是加入sys.server_principals并从那里拉出名称,但SUSER_NAME似乎是一种更清洁的方法。

Sol*_*zky 5

您可以通过sp_executesql使用 4 部分名称在该远程服务器上执行来在该链接服务器上执行动态 SQL 。然后你只需将它分配给一个标记为的变量OUTPUT

DECLARE @RemoteName sysname,
        @LoginID INT;

SET @LoginID = 267;

EXEC [LinkedServerName].master.dbo.sp_executesql
    N'SET @tmpRemoteName = SUSER_NAME(@tmpLoginID);',
    N'@tmpLoginID INT, @tmpRemoteName sysname OUTPUT',
    @tmpLoginID = @LoginID,
    @tmpRemoteName = @RemoteName OUTPUT;

SELECT @RemoteName;
Run Code Online (Sandbox Code Playgroud)

当然,这是否比 JOIN 到远程表“更干净”是有争议的,因为每种方法都有优点和缺点。