简体   繁体   English

使用 OPENQUERY 将二进制变量传递给链接服务器

[英]Pass a binary variable to a linked server using OPENQUERY

I'm using SQL Server 2019 and I use a linked server to connect to another SQL Server.我使用的是 SQL Server 2019,我使用链接服务器连接到另一个 SQL Server。

I need to run a system function on the linked server, I'm using OPENQUERY to run the function on the linked server which is working fine in many cases.我需要在链接服务器上运行一个系统函数,我正在使用OPENQUERY在链接服务器上运行该函数,这在很多情况下都运行良好。 However one of the functions expects a BINARY parameter.但是,其中一个函数需要一个BINARY参数。 I have got no clue on how to pass a binary variable to the linked server using OPENQUERY .我不知道如何使用OPENQUERY将二进制变量传递给链接服务器。 Please can someone help?请问有人可以帮忙吗? see my code sample below.请参阅下面的代码示例。

DECLARE @To_LSN  AS binary(10);
DECLARE @To_LSN_Timestamp datetime;

SELECT @To_LSN  = ReturnValue 
FROM OPENQUERY (LNK_SQL_SERVER, 
                'SELECT MY_DB.sys.fn_cdc_get_max_lsn() AS ReturnValue;');       

SELECT @To_LSN_Timestamp = ReturnValue 
FROM OPENQUERY (LNK_SQL_SERVER, 
                'SELECT MY_DB.sys.fn_cdc_map_lsn_to_time(@To_LSN) AS ReturnValue;');        

-- it won't accept the @To_LSN as a parameter.

In the second query above the function expects a binary parameter ( @To_LSN ), so if I try to split the query as a dynamic SQL it throws error as conversion between varchar and binary fails.在上面的第二个查询中,函数需要一个二进制参数 ( @To_LSN ),因此如果我尝试将查询拆分为动态 SQL,它会抛出错误,因为varcharbinary之间的转换失败。

If you just need the LSN timestamp, why not do it in a single step and avoid any string or binary conversions/concatenation?如果您只需要 LSN 时间戳,为什么不一步完成并避免任何字符串或二进制转换/连接?

SELECT @To_LSN_Timestamp = ReturnValue 
  FROM OPENQUERY
  (
    LNK_SQL_SERVER, 
    N'SELECT MY_DB.sys.fn_cdc_map_lsn_to_time(
        MY_DB.sys.fn_cdc_get_max_lsn()
      ) AS ReturnValue;');

Even better:更好的是:

EXEC LNK_SQL_SERVER.MY_DB.sys.sp_executesql 
  N'SELECT @rv = sys.fn_cdc_map_lsn_to_time(
        sys.fn_cdc_get_max_lsn());', 
  N'@rv datetime OUTPUT',
    @rv = @To_LSN_Timestamp OUTPUT;

If you need both the LSN and the timestamp outside, then:如果您同时需要 LSN 和外部时间戳,那么:

EXEC LNK_SQL_SERVER.MY_DB.sys.sp_executesql 
  N'SELECT @lsn = sys.fn_cdc_get_max_lsn();
    SELECT @rv  = sys.fn_cdc_map_lsn_to_time(@lsn);', 
  N'@lsn binary(10) output, @rv datetime OUTPUT',
    @lsn = @To_LSN           OUTPUT,
    @rv  = @To_LSN_Timestamp OUTPUT;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM