0

我正在尝试插入一些数据。它没有使用事务插入表中。相反,它将进入 catch 块。下面是sql存储过程:GO

/****** Object:  StoredProcedure [dbo].[rml_re_GetAndStoreConsumerSubscriptionData_NEWUPS] Script Date: 05/21/2012 12:39:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--EXEC rml_re_GetAndStoreConsumerSubscriptionData_NEWUPS
ALTER PROCEDURE [dbo].[rml_re_GetAndStoreConsumerSubscriptionData_NEWUPS]  

AS
BEGIN  
 DECLARE @currenttime datetime  
 SET @currenttime= getdate()  
 INSERT INTO rml_re_consumerdatasync_log VALUES('rml_re_GetAndStoreConsumerSubscriptionData',@currenttime,null,'started',@currenttime,'',getdate(),null);  
  BEGIN TRY  
    BEGIN TRANSACTION PULLCONSUMERDATA  
        DECLARE @dbServerName VARCHAR(50),@databaseName VARCHAR(50),@dbUserName VARCHAR(50),@query VARCHAR(MAX)    
        SELECT  @dbServerName=dbservername,@databaseName=dbname,@dbUserName=dbusername FROM rml_re_applications   
        WHERE id=(SELECT configvalue FROM rml_re_configuration WHERE configname='CRMApplicationID')

        -- Removes all old data before insertion.  
        ALTER TABLE [dbo].[rml_re_consumermarkets] DROP CONSTRAINT [FK_rml_re_consumermarkets_rml_re_consumercrops]
        ALTER TABLE [dbo].[rml_re_consumermarkets] DROP CONSTRAINT [FK_rml_re_ConsumerSubscriptionMarket_rml_re_ConsumerSubscriptionData]
        ALTER TABLE [dbo].[rml_re_consumercrops] DROP CONSTRAINT [FK_rml_re_ConsumerSubscriptionCrops_rml_re_ConsumerSubscriptionData]

        TRUNCATE TABLE rml_re_consumermarkets
        TRUNCATE TABLE rml_re_consumercrops
        TRUNCATE TABLE rml_re_ConsumerSubscriptionData

    ALTER TABLE [dbo].[rml_re_consumercrops]  WITH NOCHECK ADD  CONSTRAINT [FK_rml_re_ConsumerSubscriptionCrops_rml_re_ConsumerSubscriptionData] FOREIGN KEY([subscriptionid])
    REFERENCES [dbo].[rml_re_ConsumerSubscriptionData] ([id])
    ALTER TABLE [dbo].[rml_re_consumermarkets]  WITH NOCHECK ADD  CONSTRAINT [FK_rml_re_ConsumerSubscriptionMarket_rml_re_ConsumerSubscriptionData] FOREIGN KEY([subscriptionid])
    REFERENCES [dbo].[rml_re_ConsumerSubscriptionData] ([id])
    ALTER TABLE [dbo].[rml_re_consumermarkets]  WITH CHECK ADD  CONSTRAINT [FK_rml_re_consumermarkets_rml_re_consumercrops] FOREIGN KEY([cropid])
    REFERENCES [dbo].[rml_re_consumercrops] ([cropid])


        SET @query='';
        SET @query= 'INSERT INTO rml_re_ConsumerSubscriptionData(id,msisdn,consumername,
                    languagetype,statecode,talukcode,districtcode,regioncode,status,
                    subscriptionstartdate,subscriptionenddate,DistributorCode,
                    package,soiltype,comp_category,AdditionalInfo) 
                            SELECT  id,msisdn,
                            case when Len(consumername) <=150 then consumername else null end  as consumername,
                            case when Len(languagetype) <=10 then languagetype else null end  as languagetype ,'  
        SET @query=@query+' case when Len(statecode) <=5 then statecode else null end  as statecode ,
                            case when Len(talukcode) <=10 then talukcode else null end  as talukcode  ,
                            case when Len(districtcode) <=10 then districtcode else null end  as districtcode,
                            case when Len(regioncode) <=10 then regioncode else null end  as regioncode ,
                            case when Len(status) <=50 then status else null end  as status ,
                            subscriptionstartdate ,'  
        SET @query=@query+' subscriptionenddate,
                            case when Len(DistributorCode) <=100 then DistributorCode else null end as DistributorCode ,
                            case when Len(package) <=50 then package else null end AS package ,
                            case when Len(soiltype) <=50 then soiltype else null end   as soiltype,'  
        SET @query=@query+' case when Len(comp_category) <=50 then comp_category  else null end  as comp_category  ,
                            case when Len(AdditionalInfo) <=100 then AdditionalInfo  else null end  as AdditionalInfo '  
        SET @query=@query+' FROM '  
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New '
        SET @query=@query+' WHERE crop1code is not null AND crop2code is not null '



        EXEC (@query)  
        SET @query='';
        -- INSERT FOR rml_re_consumercrops
        --INSER FOR PRIMARY CROP
        SET @query='INSERT INTO rml_re_consumercrops(subscriptionid,commoditycode,sowingdate,sowingweek)'
        SET @query=@query+'SELECT id,case when Len(crop1code) <=15 then crop1code  else null end  as crop1code ,sowingdate1,DATEDIFF (WEEK,sowingdate1,getdate()) '
        SET @query=@query+' FROM '
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New '
        SET @query=@query+' WHERE crop1code is not null AND crop2code is not null'


        EXEC (@query)  
        SET @query=''
        --INSER FOR SECONDARY CROP
        SET @query='INSERT INTO rml_re_consumercrops(subscriptionid,commoditycode,sowingdate,sowingweek)'
        SET @query=@query+'SELECT id,case when Len(crop2code) <=15 then crop2code  else null end  as crop2code  ,sowingdate2,DATEDIFF (WEEK,sowingdate2,getdate()) '
        SET @query=@query+'FROM '
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New '
        SET @query=@query+' WHERE crop1code is not null AND crop2code is not null'

        EXEC (@query)  
        SET @query=''

        --INSERT FOR rml_re_consumermarkets
        --INSER FOR PRIMARY CROP
        SET @query='INSERT INTO rml_re_consumermarkets(cropid,subscriptionid,marketcode,ric)'
        SET @query=@query+'SELECT CS.cropid,E.id,case when Len(M.item) <=15 then M.item  else null end AS marketcode ,case when Len( R.item) <=15 then  R.item  else null end  AS ric '
        SET @query=@query+'FROM rml_re_consumercrops CS,'
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New  E ' 
        SET @query=@query+' OUTER APPLY fnSplit(E.Ric1,'+''','''+') R,'
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New  F '
        SET @query=@query+' OUTER APPLY fnSplit(F.MandiCode1,'+''','''+') M '
        SET @query=@query+' WHERE F.ID = E.ID 
                AND R.ID = M.ID
                AND CS.commoditycode = E.crop1code
                AND CS.subscriptionid=E.id 
                AND CS.subscriptionid=F.id '
        SET @query=@query+' AND E.crop1code is not null AND E.crop2code is not null'
        SET @query=@query+' AND F.crop1code is not null AND F.crop2code is not null'

        EXEC (@query)  
        SET @query=''
        --INSER FOR SECONDARY CROP
        SET @query='INSERT INTO rml_re_consumermarkets(cropid,subscriptionid,marketcode,ric) '
        SET @query=@query+'SELECT CS.cropid,E.id,case when Len(M.item) <=15 then M.item  else null end AS marketcode,case when Len( R.item) <=15 then R.item  else null end AS ric  '
        SET @query=@query+'FROM rml_re_consumercrops CS,'
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New  E '
        SET @query=@query+' OUTER APPLY fnSplit(E.Ric2,'+''','''+') R,'
        SET @query=@query+' ['+@dbServerName+'].'+@databaseName+'.'+@dbUserName+'.rml_re_getConsumerSubscriptionData_New  F ' 
        SET @query=@query+' OUTER APPLY fnSplit(F.MandiCode2,'+''','''+') M '
        SET @query=@query+' WHERE F.ID = E.ID 
              AND R.ID = M.ID
              AND CS.commoditycode = E.crop2code
              AND CS.subscriptionid=E.id 
              AND CS.subscriptionid=F.id '
        SET @query=@query+' AND E.crop1code is not null AND E.crop2code is not null'
        SET @query=@query+' AND F.crop1code is not null AND F.crop2code is not null'

    EXEC (@query)       
    COMMIT TRANSACTION PULLCONSUMERDATA  
    UPDATE  rml_re_consumerdatasync_log SET status='completed',endtime=getdate() WHERE logdate=@currenttime  
  END TRY  
  BEGIN CATCH  
  --  ROLLBACK TRANSACTION PULLCONSUMERDATA  

    UPDATE  rml_re_consumerdatasync_log SET status='failure',error_info=ERROR_MESSAGE() WHERE logdate=@currenttime  
  END CATCH  

END  

--exec rml_re_GetAndStoreConsumerSubscriptionData



GO
4

1 回答 1

0

好的,首先这里有一些事情可以帮助自己。向 proc 添加一个默认值为 0 的调试参数。然后添加代码以打印动态 SQl,而不是在将调试参数值设置为 1 时运行它。这应该是您在任何时候使用动态 SQl 时的标准做法过程。很可能其中一个动态语句没有正确形成,因此您需要查看生成的 SQL 以找出问题所在。

您将失败存储在 catch 块中,您收到什么错误消息?

于 2012-05-22T14:50:21.870 回答