sql server function 带参数,要调用oracle function

stargigi 2017-02-22 09:50:33
因为建VIEW会使用到oracle function,所以在sql server中建立function,使用openquery,要带参数不知道改怎么使用

FUNCTION [dbo].[FU1]
(
@V_1 VARCHAR(255),@V_2 VARCHAR(255),
)
RETURNS @TABLE TABLE (A varchar(25))
AS
BEGIN
DECLARE @sql varchar(500)
DECLARE @A varchar(500)

BEGIN
set @sql = 'select @A=A from openquery(TN,'' select FU_1('''''+@V_1+''''''+','+''''''+@V_2+'''''') AS A from dual'')';

execute sp_executesql @sql;
INSERT INTO @TABLE (A) values(@A)
end
RETURN
END

...全文
821 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2017-03-02
  • 打赏
  • 举报
回复
这有的狗屁设计就是只给程序调用的,而且是单笔操作。
其它的功能(跨数据库/批量)既然没提供,就别多想了:
按照我#18的建议,程序在插入AAA记录之前先调用一次函数,把返回值作为AAA的字段值一起插入。

当然你也可以按#20的建议用 SQL CLR 封装成 SQL Server 函数。
但是我并不看好跨库带有更新功能的函数的调用性能,在查询中批量调用应该会严重超时吧,不适用。
stargigi 2017-03-02
  • 打赏
  • 举报
回复
建View 可以呼叫存储过程吗?
昵称被占用了 2017-03-01
  • 打赏
  • 举报
回复
sql server的自定义函数还是少用 限制很多不说,性能还成问题 一定要的话,写个CLR函数,在CLR函数中访问oracle,这样跨得太多,对编写者眼球太高了 还是用存储过程吧
stargigi 2017-03-01
  • 打赏
  • 举报
回复
就是这么狗屁设计,所以openquery 在Function就真的无法传参数??
Tiger_Zhao 2017-02-24
  • 打赏
  • 举报
回复
什么狗屁设计?
查询/更新应该分开。
你在生成 AAA 记录的同时就应该调用 Oracle 的插入功能。
可以把结果记在 AAA 表中,也可以用#16的方式后期查询。
stargigi 2017-02-24
  • 打赏
  • 举报
回复
我ORACLE FUNCTION 会做一些INSERT动作,不能用的原始表/视图拿来直接用
stargigi 2017-02-23
  • 打赏
  • 举报
回复
select * from FU1('AA','BB') FU1 是sql server function 出錯錯誤:只有函数和一些扩充预存程序可以从函数内执行,他不給我使用EXECUTE sp_executesql
Tiger_Zhao 2017-02-23
  • 打赏
  • 举报
回复
这不很正常啊。
无论哪个数据库都不能调用自己没有的函数啊。
Oracle 函数当然要用 OpenQuery 送到 Oracle 上执行。
stargigi 2017-02-23
  • 打赏
  • 举报
回复
在SQL SERVER :select * from FU1('AA','BB') 出現錯誤:只有函数和一些扩充预存程序可以从函数内执行 SELECT fu_1(...) FROM DUAL 是oracle function
中国风 2017-02-23
  • 打赏
  • 举报
回复
引用 6 楼 stargigi 的回复:
使用解决方法#1 出現:只有函数和一些扩充预存程序可以从函数内执行 function 不能用:EXECUTE sp_executesql 有其他方法吗?
报错是一定的,函数不支持动态T-SQL,参照上面方法改
Tiger_Zhao 2017-02-23
  • 打赏
  • 举报
回复
不理解你说的。你的代码不是已经通过 SELECT fu_1(...) FROM DUAL 的方式成功调用了函数。
stargigi 2017-02-23
  • 打赏
  • 举报
回复
使用解决方法#1 出現:只有函数和一些扩充预存程序可以从函数内执行 function 不能用:EXECUTE sp_executesql 有其他方法吗?
Tiger_Zhao 2017-02-23
  • 打赏
  • 举报
回复
你把 Oracle 段 FU_1 用的原始表/视图拿来直接用
CREATE VIEW [dbo].[V_AAA]
AS

select a.Comp,
a.EmpId,
s.State
from AAA a
JOIN openquery(TN, 'SELECT Comp,EmpId,State FROM sourceTable') s
ON a.Comp = s.Comp
AND a.EmpId = s.EmpId
stargigi 2017-02-23
  • 打赏
  • 举报
回复
因为我要建立View,会呼叫 oracle function 该怎么解决 CREATE VIEW [dbo].[V_AAA] AS select Comp,EmpId,FU1(dbo.Comp,EmpId) AS State from dbo.AAA
Tiger_Zhao 2017-02-23
  • 打赏
  • 举报
回复
我靠,原来是函数内不能使用动态语句的问题,见#2。
提问和调用 oracle function 扯什么关系,我一直在往这个方向找问题
stargigi 2017-02-23
  • 打赏
  • 举报
回复
Oracle Function

CREATE OR REPLACE FUNCTION FU_1(V_1 varchar,V_2 varchar) RETURN VARCHAR2 AS 
V_State varchar2(4);
BEGIN
  select State INTO V_State from EMP where Comp=V_1 and EmpId=V_2;
  return V_State;
END FU_1;
Sql server function

ALTER FUNCTION [dbo].[FU1]
(	
     @V_1 VARCHAR(255),    
     @V_2 VARCHAR(255)
)
RETURNS @TABLE TABLE (State varchar(25))
AS
BEGIN  
        DECLARE @sql varchar(500)
        DECLARE @A varchar(500)

        BEGIN
		
		set @sql = 'select @A=A from openquery(TN,'' select FU_1('''''+@V_1+''''''+','+''''''+@V_2+''''')  AS A from dual'')';

			execute sp_executesql @sql,
                      N' @A NVARCHAR(50) OUTPUT',
                       @A= @A OUTPUT
					   
INSERT INTO @TABLE (State) values(@A)
        end

RETURN
END
select * from FU1('TN','9909009') 只有函数和一些扩充预存程序可以从函数内执行
Tiger_Zhao 2017-02-23
  • 打赏
  • 举报
回复
什么乱七八糟的,OPENQUERY 中的语句是在 Oracle 上执行的,和 SQL Server 的函数有什么关系。

比如我用Access数据库,那么下面的Access语句用来把字段fid中的NULL替换为0返回
SELECT id, IIf(IsNull(fid),0,fid) AS x FROM D


要在 SQL Server 中调用,OPENQUERY 用的还是 Access 语法(IIf函数和IsNull函数)
DECLARE @sql nvarchar(500)
SET @sql = 'select * from openquery(db1,''SELECT id, IIf(IsNull(fid),0,fid) AS x FROM D'')';
EXECUTE sp_executesql @sql;


如果改用 SQL Server 的 ISNULL 函数,就会报错
DECLARE @sql nvarchar(500)
SET @sql = 'select * from openquery(db1,''SELECT id, ISNULL(fid,0) AS x FROM D'')';
EXECUTE sp_executesql @sql;

链接服务器"db1"的 OLE DB 访问接口 "MSDASQL" 返回了消息 "[Microsoft][ODBC Microsoft Access Driver] 用于函数参数的个数不对 在查询表达式 'ISNULL(fid,0)' 中。"。
消息 7350,级别 16,状态 2,第 1 行
无法从链接服务器 "db1" 的 OLE DB 访问接口"MSDASQL"获取列信息。

stargigi 2017-02-22
  • 打赏
  • 举报
回复
改用PROCEDURE,View可以建立吗?该怎么建立
中国风 2017-02-22
  • 打赏
  • 举报
回复
把SQL函数改为存储过程,再拼凑动态SQL 字符串
Tiger_Zhao 2017-02-22
  • 打赏
  • 举报
回复
-- 内外变量没有自动对应关系,需要显式指定
EXECUTE sp_executesql @sql,
N'@A varchar(500) OUTOUT'
@A = @A OUTPUT;

INSERT INTO @TABLE (A) values(@A)
加载更多回复(2)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧