EXEC sp_executesql: 没有跨服务器加入

EXEC sp_executesql: No cross server join

我想执行以下带有子句的语句以防止跨服务器连接:

SET @Sql = N'
    SELECT TOP(1) @CodeID = CodeType
    FROM ' + QUOTENAME(@Db) + '.bla.Field 
    WHERE Name = @SearchName'

EXEC sp_executesql @Sql,
    N'@SearchName NVARCHAR(256), @CodeID NVARCHAR(256) OUTPUT',
    @SearchName, @CodeID OUTPUT

对于 EXEC,我使用此语句:

  SET @Sql = 'EXEC (''' + REPLACE(@Sql, '''', '''''') + ''')' + CASE WHEN @ServerName = @ThisServer THEN '' ELSE ' AT ' + @ServerName END
    EXEC ( @Sql )

如何调整我的陈述以与 EXEC sp_executesql 一起工作?

您可以利用过程名称 EXEC 调用可以通过变量提供的事实。这样可以是:

DECLARE @exec nvarchar(1000) = N'sys.sp_executesql';
EXEC @exec N'SELECT 1';

-- 或

DECLARE @exec nvarchar(1000) = QUOTENAME(@db) 
  + N'.sys.sp_executesql';
EXEC @exec N'SELECT 1';

-- 或

DECLARE @exec nvarchar(1000) = QUOTENAME(@server) + N'.'
  + QUOTENAME(@db) 
  + N'.sys.sp_executesql';
EXEC @exec N'SELECT 1';

你的情况:

DECLARE @Sql nvarchar(max) = N'
    SELECT TOP(1) @CodeID = CodeType
    FROM bla.Field 
    WHERE Name = @SearchName;';

DECLARE @exec nvarchar(1000) = CASE
  WHEN @ServerName = @ThisServer THEN N''
  ELSE QUOTENAME(@ServerName) + N'.' END
  + QUOTENAME(@db) + N'.sys.sp_executesql';

EXEC @exec @Sql,
    N'@SearchName NVARCHAR(256), @CodeID NVARCHAR(256) OUTPUT',
    @SearchName, @CodeID OUTPUT;