web-dev-qa-db-ja.com

リンクサーバーで組み込み関数を実行する

SQL 2014サーバーが2台あり、そのうちの1台から別のサーバーにリンクサーバーを作成しました。実行しようとしているタスクの一部として、ローカルサーバーとリンクサーバーの両方でSQLユーザーIDをユーザー名に変換する必要があります。

ローカルサーバーで私はただ呼び出すことができます

SELECT SUSER_NAME(1)

文字列saを返します

リンクサーバーで関数SUSER_NAMEを実行して、そこから値を取得する簡単な方法はありますか?

私が見つけたと思う他の代替案は、sys.server_principalsに結合してそこから名前を取り出すことですが、SUSER_NAMEはよりクリーンなアプローチのようです。

4
Greg

4部構成の名前を使用してリモートサーバーでsp_executesqlを実行することにより、そのリンクサーバーでダイナミック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;

もちろん、それぞれのアプローチには賛否両論があるので、これがそのリモートテーブルにJOINするよりも「クリーン」かどうかについては議論の余地があります。

4
Solomon Rutzky