首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于存储过程的 急解决思路

2013-09-05 
关于存储过程的 急USE [CSM]GO/****** Object:StoredProcedure [dbo].[proc_addJobsToRemoteSQLServer1]Sc

关于存储过程的 急
USE [CSM]
GO
/****** Object:  StoredProcedure [dbo].[proc_addJobsToRemoteSQLServer1]    Script Date: 08/24/2013 11:31:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:<William>
-- Create date: <04/22/2013>
-- Description:<将本地的采集任务,更新到服务器数据库中>
-- =============================================
ALTER PROCEDURE [dbo].[proc_addJobsToRemoteSQLServer1]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @server_id INT;
DECLARE @ati_id INT;
DECLARE @c_id BIGINT;
DECLARE @ServerIP varchar;
    DECLARE @SQL varchar;
-- @returnValue
-- 0:没有限制的服务器
-- @ati_id:推送成功,返回当前推送的任务id
-- -1:异常
-- -2:任务队列中没有等待的采集任务
DECLARE @returnValue INT;

-- Insert statements for procedure here
--EXEC sp_configure 'show advanced options',1
--RECONFIGURE;
--EXEC sp_configure 'Ad Hoc Distributed Queries',1
--RECONFIGURE

-- 查看当前是否有闲置服务器
--BEGIN TRY
SET @server_id=cpr_test.dbo.fun_getGatherWebserviceID2()

-- 没有闲置服务器
IF @server_id=0
BEGIN
SET @returnValue=0;
RETURN @returnValue;
END

-- 1.取第一个状态为0,且类型属于采集的任务,将其ID赋值给@ati_id --
SET @ati_id=(SELECT TOP 1 ati_id FROM cpr_test.dbo.AutorunTaskInfo WITH(NOLOCK) 
WHERE ati_status=0 and ati_attid in (2,3,17,21) ORDER BY ati_level desc, ati_createdate)

--IF @ati_id IS NULL OR @ati_id=''
IF cast(@ati_id as varchar) IS NULL OR cast(@ati_id as varchar)=''
BEGIN
SET @returnValue=-2;
RETURN @returnValue;
END
-- 任务队列中,有未被激活的采集任务
IF @ati_id>0
BEGIN

if @server_id=1 set @ServerIP='50.63.**.***'
    if @server_id=2 set @ServerIP='76.12.**.***'
    if @server_id=3 set @ServerIP='50.63.**.***'
    if @server_id=4 set @ServerIP='50.63.**.***'
    IF @server_id=5 set @ServerIP='50.63.**.***'
    if @server_id=6 set @ServerIP='50.63.**.***'
-- @server_id1:50.63.60.210

-- 2.将ASIN更新到dbo.AMA_TASKCONDITIONS表中 --
-- 将新插入到dbo.AMA_TASKCONDITIONS表中的数据ID赋值给@c_id
SET @SQL ='INSERT INTO OPENDATASOURCE(''sqloledb'',''server='+@ServerIP+'1;uid=sa;pwd=db!@#$1234;database=Amazon_GInfoDB'').Amazon_GInfoDB.dbo.AMZ_TASKCONDITIONS (c_other, c_relateid) 


SELECT ati_conditions, '+cast(@ati_id as varchar)+'
FROM cpr_test.dbo.AutorunTaskInfo WITH(NOLOCK)
WHERE ati_id='+cast(@ati_id as varchar)+''
EXEC (@SQL)
SET @SQL ='SELECT '+cast(@c_id as varchar)+'=c_id FROM OPENDATASOURCE(''sqloledb'',''server='+@ServerIP+';uid=sa;pwd=db!@#$1234;database=Amazon_GInfoDB'').Amazon_GInfoDB.dbo.AMZ_TASKCONDITIONS
WHERE c_relateid='+cast(@ati_id as varchar)+''
EXEC (@SQL)

-- 3.将此任务更新到dbo.AMZ_TASKINFO表中
-- 采集服务器时间已经和本地时间同步
SET @SQL ='INSERT INTO OPENDATASOURCE(''sqloledb'',''server='+@ServerIP+';uid=sa;pwd=db!@#$1234;database=Amazon_GInfoDB'').Amazon_GInfoDB.dbo.AMZ_TASKINFO (
t_relateid,t_c_id,t_iscompleted,t_isrunning,t_level,t_runinterval,t_adddate) 
SELECT '+cast(@ati_id as varchar)+','+cast(@c_id as varchar)+',0,0,ati_level,ati_timespan,ati_createdate 
FROM cpr_test.dbo.AutorunTaskInfo WITH(NOLOCK)
WHERE ati_id='+cast(@ati_id as varchar)+''
EXEC (@SQL)
-- 4.任务推送成功,将本地中此任务ID的状态更新为执行状态
UPDATE cpr_test.dbo.AutorunTaskInfo 
SET ATI_Status=1, ATI_GWIID=@server_id, ATI_BeginDate=getdate()
WHERE ATI_ID=@ati_id

END
SET @returnValue=@ati_id
print @returnValue;
RETURN @returnValue;
END

[解决办法]
这样我们也查不出什么,你执行的四条语句:
EXEC (@SQL)

你在执行前先
print @SQL
看看有没有问题

[解决办法]
--#1.从这个提示信息和存储过程的内容中,看不出有什么问题。楼主应该想办法调试
--#2.首先,要确定是否是调用这个存储过程时出的错。可在代码中打断点。
--#3.如果确定是调用这个存储过程时出的错,那就把代码中的参数值抓出来,然后直接在SQL SERVER中执行这个存储过程,只要问题能重现,剩下都不是问题。
--#4.确定是存储过程的问题后,就给存储过程加调试信息,比较加些PRINT语句,以判断代码是否执行到这一行,且已经执行的SQL的结果值是否正确。如果只能生产环境调试,就创建一个test表,然后往存储过程中加一些INSERT test语句来代码PRINT语句,通过查看test表中的信息,即可知道存储过程执行到哪里的时候报的错。如果有条件,也可以直接利用SQLSERVER的调试功能,一步一步执行存储过程,更方便。

热点排行