[英]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,它会抛出错误,因为varchar
和binary
之间的转换失败。
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.