select * from openquery +附近有错误

可以看到这样直接通过链接数据库调用是不行的。需要换个方式,改用OPENQUERY。

DECLARE @a VARCHAR(50)
set @a = (select * from openquery(LS,'select Test.dbo.FUN_ReturnValue(''haha'')'))
select @a --返回的字符串值

SELECT * from openquery(LS,'select * from Test.dbo.FUN_ReturnTable(''haha'')') --返回的表值

以上的调用,函数的参数值是写死的,如果传一个动态参数,改成下面这样:

DECLARE @a VARCHAR(50)
DECLARE @b VARCHAR(50)
set @a = (select * from openquery(LS,'select Test.dbo.FUN_ReturnValue('''+@b+''')'))
select @a

是无法运行的,提示错误:

SQL-SERVER-RPC-FUNCTION-CALL-1

这个问题我就费解了,OPENQUERY的第二个参数不能直接带有动态变量,不知道啥原因,官网上也备注说明不可以含有参数。

解决方法是换种方式调用,改用EXEC的方法。

DECLARE @b VARCHAR(50)
DECLARE @sql varchar(500)
set @b = 'haha';
set @sql = 'select a from openquery(LS,''select Test.dbo.FUN_ReturnValue('''''+@b+''''') AS a'')';
exec(@sql);

以上语句是可以执行的,输出“Input para is haha”单行的字符串。那么现在问题来了,我想将现在输出的结果赋值给一个本地变量@a,所以想当然就这样写

DECLARE @a VARCHAR(50)
DECLARE @b VARCHAR(50)
DECLARE @sql varchar(500)
set @b = 'haha';
set @sql = 'select a from openquery(LS,''select Test.dbo.FUN_ReturnValue('''''+@b+''''') AS a'')';
set @a = exec(@sql); --是错误的,语法错误
set @a = (select * from exec(@sql)); --是错误的,语法错误
select @a;

以上给@a变量赋值方法都不行。于是将@a改为表变量。

DECLARE @b VARCHAR(50)
DECLARE @sql varchar(500)
DECLARE @a table( name varchar(50))
set @b = 'haha';
set @sql = 'select a from openquery(LS,''select Test.dbo.FUN_ReturnValue('''''+@b+''''') AS a'')';
insert into @a exec(@sql); --将结果插入表里
select name from @a

这样结果就保存到表变量了。调用返回表值的函数也是可以的。

DECLARE @b VARCHAR(50)
DECLARE @sql varchar(500)
DECLARE @a table( name varchar(50))
set @b = 'haha';
set @sql = 'select * from openquery(LS,''select * from Test.dbo.FUN_ReturnTable('''''+@b+''''') AS a'')'; --调用表值函数。
insert into @a exec(@sql);
select name from @a

总结

  • 1.SQL SERVER通过链接服务器是可以调用远程数据库的存储过程的。
    • 通过 exec LS.Test.dbo.testSP 'haha' 的方式,其中LS是链接服务器,Test是数据库名称。但是这种方式需要将链接服务器配置为用户RPC。
    • 通过 select * from openquery(LS,'exec Test.dbo.testSP ''haha'' ')的方式,其中LS是链接服务器,Test是数据库名称。
  • 2.SQL SERVER通过链接服务器远程调用函数不能通过 LS.Test.dbo.testFun('haha')的方式直接调用,改用OPENQUERY的方式。
  • 3.OPENQUERY的第二个参数不能含有参数变量。如果需要传递参数,改成拼接字符串的形式,EXEC 命令执行字符串。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxfamn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值