`
happmaoo
  • 浏览: 4349067 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQLServer2000存储过程中通过数据库链接操作Oracle数据库

阅读更多
function StorePage() { d=document; t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():''); void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }

2005-2-22开发日记:

我的存储过程局部如下:

CREATE PROCEDURE P_Job_ScanMOMessage
AS

---Step1:从Oracle数据库中读取上行记录写进表:T_DWS_MO_Message
INSERT INTO T_DWS_MO_Message(MO_Mobile,SMSContent,LinkID) Select MOMobile, Content,LinkID From openquery(hnoracle,'Select * From MOMessage8')

---Step2:删除Oracle数据库上的上行记录
Delete from openquery(hnoracle,'Select * From MOMessage8')

.....

注意:蓝色字体部分的两条语句,是操作Oracle数据库的.

在SQLServer2000企业管理器中编辑存储过程总是出现:
SQL-DMO (ODBC SQLState:42000)
错误:7405 异类查询要求为连接设置 ANSI_NULLS和ANSI_WARNINGS ...........


解决方法如下:
请在查询分析器中创建这个存储过程,以后这个存储过程在企业管理和查询分析器都能修改了。

对于存储过程,SQL Server 使用最初创建存储过程时的 SET ANSI_NULLS 设置值。无论随后何时执行存储过程,SET ANSI_NULLS 的设置都还原为其最初使用的值并生效。当在存储过程内唤醒调用 SET ANSI_NULLS 时,其设置不更改。

在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。

在执行分布式查询时应将 ANSI_WARNINGS 设置为 ON。

企业管理中的ANSI_NULLS和ANSI_WARNINGS选项不对,但没有方法改动。在查询分析器可以设置ANSI_NULLS和ANSI_WARNINGS选项,而且默认值是对的。所以能在查询分析器创建此类存储过程,而不能在企业管理器创建此类存储过程。


function StorePage() { d=document; t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():''); void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }

CREATE Function GetByteSubstring(@str varchar(8000),@len int)
returns varchar(8000)
as
begin
declare @i int
exec master..sp_GetMBCSCharLen @str,@len,@i out
if @i is not null set @str=left(@str,@i)
return(@str)
end

function StorePage() { d=document; t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():''); void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }





SET XACT_ABORT ON <--必须设置这条语句

-- 必须设置这个选项目,否则出现 OLE DB 错误跟踪
--[OLE/DB Provider 'MSDAORA' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096
--解决异构服务器的触发器 参考:http://support.microsoft.com/default.aspx?scid=kb;EN-US;280106

创建链接数据库方式的步骤在这里不重复说明,很多地方都有资料!

CREATE TRIGGER TransferMTMessage ON [dbo].[T_DWS_MT_Message]
FOR INSERT
AS

-- 必须设置这个选项目,否则出现 OLE DB 错误跟踪
--[OLE/DB Provider 'MSDAORA' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096
--解决异构服务器的触发器 参考:http://support.microsoft.com/default.aspx?scid=kb;EN-US;280106
SET XACT_ABORT ON

Declare @Seq int
Declare @LinkID varchar(20)
Declare @Content varchar(140)
Declare @Mobile varchar(20)

--Step1: 从Oracle数据库获取一个序列的nextval
Select @Seq=(Select * from openquery(hnoracle,'Select Seq.nextval From dual'))

--Step2: 获取新插入的数据
Select @LinkID=LinkID From INSERTED
Select @Content=SMS_Content From INSERTED
Select @Mobile=MT_Mobile From INSERTED


--Step3:将数据通过链接数据库写进Oracle数据库
INSERT INTO [hnoracle]..[HAILINE].[MTMESSAGE](MTMSGID,MTMOBILE,CONTENT,LINKID,STATUS,SENDTIME,SPFLAG)
Values(@Seq, @Mobile, @Content, @LinkID,0,NULL,NULL)

--Step4:删除本地SQLServer下行信息
Delete From T_DWS_MT_Message Where ID IN( Select ID From INSERTED)

Return

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics