OPENQUERY使用
来源:互联网 发布:安卓编程权威指南第3版 编辑:程序博客网 时间:2024/06/06 00:41
【SQL SERVER】OPENQUERY远程函数引用及参数传值问题
模拟数据
两台服务器,都安装有数据库,服务器A,服务器B。服务器B的数据库上配置有指向服务器A的数据库的链接数据库。服务器A的数据库Test里创建以下两个函数,一个函数返回一个表值,一个返回单个字符串值。
CREATE FUNCTION FUN_ReturnTable( @para VARCHAR(50))RETURNS @table TABLE( col VARCHAR(50))ASBEGIN INSERT INTO @table ( col ) VALUES ( 'This is Test.'), ( @para )RETURNEND GO CREATE FUNCTION FUN_ReturnValue (@para VARCHAR(50)) RETURNS varchar(50)ASBEGIN RETURN ('Input para is '+@para)END GO
调用测试
服务器A上的数据库可以执行
SELECT * FROM Test.dbo.FUN_ReturnTable('haha') --返回表SELECT dbo.FUN_ReturnValue('haha') --返回单个值
然后在服务器B上的数据库运行以下语句调用(假设配置的链接服务器为LS)
SELECT LS.Test.dbo.FUN_ReturnValue('haha')
于是就报错了:"不允许远程函数引用 'LS.Test.dbo.FUN_ReturnValue',找不到列名 'LS',或者列名不明确。"
解决方法
可以看到这样直接通过链接数据库调用是不行的。需要换个方式,改用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
是无法运行的,提示错误:
这个问题我就费解了,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
命令执行字符串。
阅读全文
0 0
- OPENQUERY使用
- OPENQUERY
- OPENQUERY
- SQL 中OPENQUERY的使用
- 转:使用OpenQuery或OPENROWSET的方法
- 转:使用OpenQuery或OPENROWSET的方法
- SQL 在OPENQUERY中使用参数
- SQL 在OPENQUERY中使用参数
- SQL 在OPENQUERY中使用参数
- SQL server 在OPENQUERY中使用参数
- SQL 在OPENQUERY中使用参数
- 链接服务器使用OPENQUERY性能提升
- 在SQL Server中使用OpenQuery访问其他数据库
- 从sql server 到Oracle使用openquery带参数查询
- openquery教程
- openquery 操作
- SQL 在OPENQUERY中使用传入参数和临时表获取参数
- OPENQUERY函数的用法
- Metropolis Light Transport学习与实现
- 剑指OFFER 算法练习
- POJ 2785 4 Values whose Sum is 0
- intent-filter的action,category,data匹配规则
- 使用tf.contrib.learn构建输入函数
- OPENQUERY使用
- 红黑树性质的理解
- 2017.8.16. 最长不下降序列
- JavaScript的数据类型、内置对象
- 页面间传数据的中文乱码问题(第七周啦)
- ECMA-Script5
- spring四种依赖注入方式
- hdu 6129(找规律)
- Hive 之 -e -f -i