Re: Multiple problems with a running job
From: Scott M. Lyon (scott.RED.lyon.WHITE_at_rapistan.BLUE.com)
Date: 11/03/04
- Next message: Scott M. Lyon: "Re: Multiple problems with a running job"
- Previous message: Alejandro Mesa: "RE: Dropping constraints"
- In reply to: Adam Machanic: "Re: Multiple problems with a running job"
- Next in thread: Scott M. Lyon: "Re: Multiple problems with a running job"
- Reply: Scott M. Lyon: "Re: Multiple problems with a running job"
- Messages sorted by: [ date ] [ thread ]
Date: Wed, 3 Nov 2004 11:21:08 -0500
I can, but it's a bit on the long side, so consider yourself warned (I've
included the narrative in comments):
ALTER PROCEDURE dbo.BUILD_FROM_LEGACY_DATA_PROC
(
@ProjectNumber varchar(6)
AS
-- This stored procedure is designed to copy data from a database of legacy
data (PROJECTORDERSYSTEM) into the new table structure (to be run on the new
database)
-- Basically we have a bunch of spares lists, where the lists are made up of
segments, and each segment is made up of materials.
--
-- The legacy data consists of Spare Parts lists, where the tables are as
follows:
-- SPARESUTILITY - contains the list number and project number for the
list (has a key SPARESKEYID)
-- SPAREPARTSMASTER - This contains the "header" information for the
list - things such as customer information, list status, etc.
-- SPAREPARTSPARTS - This contains all parts on the list, plus a lot of
information on each part - note: although a part may be on a list multiple
times, this will only have one record per part
-- SEGMENTLISTINCLUDED - This is the list of all segments included in the
list
-- SPARESEGMENTMARK - This maps the parts to the segments - this is where
it can designate a part being on a list multiple times
--
-- As for inserting to the new database, I already had stored procedures for
inserting all of this data, so instead of reinventing the wheel, I'm just
calling those stored procedures here
-- Most (if not all) of my stored procedures return an OUTPUT parameter
called @err_message which is set to 'Done' if successful, or the error if
there's an problem in the procedure
--
-- The only exception to this is at the end of this where it calculates the
"Recommended Qty" which is stored in a table mapping the list directly to
the part (so that there's only one "recommended qty"
-- per part per list, even if that part is used multiple times on
segments on the list)
DECLARE @Project_Number char(6)
DECLARE @List_Number char(2)
DECLARE @List_Description varchar(255)
DECLARE @Author char(3)
DECLARE @Target char(255)
DECLARE @Customer_Number char(6)
DECLARE @Pricing_Date smalldatetime
DECLARE @List_Status_Code char(1)
DECLARE @List_Exception_Code char(1)
DECLARE @Division_abbreviation char(2)
DECLARE @Business_Unit_abbreviation char(2)
DECLARE @err_message varchar(255)
-- Add all lists for the given project
DECLARE SparesListCursor CURSOR LOCAL STATIC FOR
SELECT SPARESUTILITY.PROJECT_NUMBER AS Project_number,
SPARESUTILITY.LIST_NUMBER AS List_number,
SPAREPARTSMASTER.[DESCRIPTION] AS List_description,
SPAREPARTSMASTER.CREATED_BY_OPID AS Author,
SPAREPARTSMASTER.REQUESTED_FOR AS Target,
SPAREPARTSMASTER.CUSTOMER_NUMBER AS Customer_Number,
SPAREPARTSMASTER.STATUS_CODE AS List_Status_Code,
SPAREPARTSMASTER.EXCEPTIONS_CODE AS List_Exception_Code
FROM PROJECTORDERSYSTEM.DBO.SPAREPARTSMASTER SPAREPARTSMASTER WITH
(NOLOCK, READUNCOMMITTED)
INNER JOIN PROJECTORDERSYSTEM.DBO.SPARESUTILITY SPARESUTILITY WITH
(NOLOCK, READUNCOMMITTED)
ON (SPARESUTILITY.SPARESKEYID = SPAREPARTSMASTER.SPARESKEYID)
WHERE SPARESUTILITY.PROJECT_NUMBER = @ProjectNumber
OPEN SparesListCursor
FETCH NEXT FROM SparesListCursor INTO @Project_number, @List_number,
@List_description, @Author, @Target, @Customer_Number, @List_Status_Code,
@List_Exception_Code
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC dbo.NEW_SPARES_LIST_PROC @Project_number, @List_number,
@List_description, @Author, @Target, @Customer_Number, @Customer_Number,
@Customer_Number,
@List_Status_Code, @List_Exception_Code, @Business_Unit_abbreviation,
@Division_Abbreviation, 1, @err_message OUTPUT
FETCH NEXT FROM SparesListCursor INTO @Project_number, @List_number,
@List_description, @Author, @Target, @Customer_Number, @List_Status_Code,
@List_Exception_Code
END
CLOSE SparesListCursor
DEALLOCATE SparesListCursor
DECLARE @Segment as varchar(2)
DECLARE @Mark_Number as int
-- Add all segments for all lists for the given project
DECLARE SparesListSegmentCursor CURSOR LOCAL STATIC FOR
SELECT DISTINCT SPARESUTILITY.PROJECT_NUMBER AS Project_number,
SPARESUTILITY.LIST_NUMBER AS List_number,
SEGMENTLISTINCLUDED.SEG_LIST AS Segment
FROM PROJECTORDERSYSTEM.DBO.SPAREPARTSMASTER SPAREPARTSMASTER WITH
(NOLOCK, READUNCOMMITTED)
INNER JOIN PROJECTORDERSYSTEM.DBO.SPARESUTILITY SPARESUTILITY WITH
(NOLOCK, READUNCOMMITTED)
ON (SPARESUTILITY.SPARESKEYID = SPAREPARTSMASTER.SPARESKEYID)
INNER JOIN PROJECTORDERSYSTEM.DBO.SEGMENTLISTINCLUDED SEGMENTLISTINCLUDED
WITH (NOLOCK, READUNCOMMITTED)
ON (SEGMENTLISTINCLUDED.SPARESKEYID = SPAREPARTSMASTER.SPARESKEYID)
WHERE SPARESUTILITY.PROJECT_NUMBER = @ProjectNumber
OPEN SparesListSegmentCursor
FETCH NEXT FROM SparesListSegmentCursor INTO @Project_number, @List_number,
@Segment
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC dbo.ADD_SEGMENT_TO_LIST_PROC @Project_number, @List_number,
@Segment, @err_message OUTPUT
FETCH NEXT FROM SparesListSegmentCursor INTO @Project_number,
@List_number, @Segment
END
CLOSE SparesListSegmentCursor
DEALLOCATE SparesListSegmentCursor
DECLARE @Material_number char(10)
DECLARE @Used_Qty int
DECLARE @Material_Exception_Code char(1)
DECLARE @Lead_Time int
DECLARE @Spares_Type_Code char(1)
DECLARE @Category_Code char(3)
DECLARE @Proprietary_Code char(1)
DECLARE @Critical_Level char(1)
DECLARE @Marks_Printed_Code char(1)
DECLARE @Order_Group_Code char(1)
DECLARE @Qty_Formula_Code char(1)
DECLARE @Spares_Indicator_Code char(1)
DECLARE @Formula_Qty int
DECLARE @UnitNumber varchar(50)
-- Add all materials (for all segments, for all lists, for the given
project)
DECLARE SparesListMaterialCursor CURSOR LOCAL STATIC FOR
SELECT SPARESUTILITY.PROJECT_NUMBER AS Project_number,
SPARESUTILITY.LIST_NUMBER AS List_number,
SPAREPARTSPARTS.PART_NUMBER AS Material_number,
SPARESEGMENTMARK.MARK_SEGMENT_NUMBER AS Segment_number,
SPARESEGMENTMARK.MARK_NUMBER AS Mark_number,
SPARESEGMENTMARK.QUANTITY AS Used_qty,
SPAREPARTSPARTS.EXCEPTIONS_CODE AS Material_Exception_Code,
SPAREPARTSPARTS.ORDERING_LEAD_TIME AS Lead_Time,
SPAREPARTSPARTS.SPARES_TYPE_CODE AS Spares_Type_Code,
SPAREPARTSPARTS.CATEGORY_CODE AS Category_Code,
SPAREPARTSPARTS.PROPRIETARY_CODE AS Proprietary_Code,
SPAREPARTSPARTS.CRITICAL_LEVEL_CODE AS Critical_Level,
SPAREPARTSPARTS.MARKS_PRINT AS Marks_Printed_Code,
SPAREPARTSPARTS.ORDERING_GROUP_CODE AS Order_Group_Code,
SPAREPARTSPARTS.QUANTITY_FORMULA_CODE AS Qty_Formula_Code,
SPAREPARTSPARTS.SPARE_PART_INDICATOR AS Spares_Indicator_Code,
SPAREPARTSPARTS.FORMULA_QUANTITY AS Formula_Qty
FROM PROJECTORDERSYSTEM.DBO.SPARESUTILITY SPARESUTILITY
INNER JOIN PROJECTORDERSYSTEM.DBO.SPAREPARTSPARTS SPAREPARTSPARTS WITH
(NOLOCK, READUNCOMMITTED)
ON (SPAREPARTSPARTS.SPARESKEYID = SPARESUTILITY.SPARESKEYID)
INNER JOIN PROJECTORDERSYSTEM.DBO.SPARESEGMENTMARK SPARESEGMENTMARK WITH
(NOLOCK, READUNCOMMITTED)
ON (SPARESEGMENTMARK.SPARESKEYID = SPAREPARTSPARTS.SPARESKEYID
AND SPARESEGMENTMARK.PART_NUMBER = SPAREPARTSPARTS.PART_NUMBER)
WHERE SPARESUTILITY.PROJECT_NUMBER = @ProjectNumber
OPEN SparesListMaterialCursor
FETCH NEXT FROM SparesListMaterialCursor INTO @Project_number, @List_number,
@material_number, @Segment, @Mark_Number, @Used_qty,
@Material_Exception_Code, @Lead_Time, @Spares_Type_Code, @Category_Code,
@Proprietary_Code, @Critical_Level, @Marks_Printed_Code, @Order_Group_Code,
@Qty_Formula_Code, @Spares_Indicator_Code, @Formula_Qty
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @UnitNumber = ''
SET @Spares_Indicator_Code = ISNULL(@Spares_Indicator_Code,'')
EXEC dbo.ADD_MATERIAL_TO_SPARES_LIST_nocheck_PROC @Project_number,
@List_number, @material_number, @Segment, @Mark_number, @Used_qty, 0,
@Formula_Qty, @UnitNumber, @err_message OUTPUT
-- This stored procedure returns 'Done' in @err_message if it completes
successfully, or an error if not, and then continues processing accordingly
IF @err_message <> 'Done'
BEGIN
IF @err_message = 'Segment not selected or found'
BEGIN
EXEC dbo.ADD_SEGMENT_TO_LIST_PROC @Project_number, @List_number,
@Segment, @err_message OUTPUT
IF @err_message <> 'Done'
BEGIN
Print 'ADD_SEGMENT_TO_LIST_PROC error:' + ISNULL(@err_message,'')
Print ' Add segment to project ' + ISNULL(@project_number,'NULL') +
', segment:' + ISNULL(@Segment,'NULL') + ', list:' +
ISNULL(@list_number,'NULL')
END
ELSE
BEGIN
EXEC dbo.ADD_MATERIAL_TO_SPARES_LIST_PROC @Project_number,
@List_number, @material_number, @Segment, @Mark_Number, @Used_qty, 0,
@Material_Exception_Code, @Lead_Time, @Spares_Type_Code, @Category_Code,
@Proprietary_Code, @Critical_Level, @Marks_Printed_Code, @Order_Group_Code,
@Qty_Formula_Code, @Spares_Indicator_Code, @Formula_Qty, @UnitNumber,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, @err_message OUTPUT
IF @err_message <> 'Done'
BEGIN
Print 'ADD_MATERIAL_TO_SPARES_LIST_PROC(attempt #2) error:' +
ISNULL(@err_message,'')
Print ' Add material:' + ISNULL(@material_number,'NULL') + ' to
project ' + ISNULL(@project_number,'NULL') + ', segment:' +
ISNULL(@Segment,'NULL') + ', list:' + ISNULL(@list_number,'NULL')
END
END
END
ELSE
BEGIN
Print 'ADD_MATERIAL_TO_SPARES_LIST_PROC error:' +
ISNULL(@err_message,'')
Print ' Add material:' + ISNULL(@material_number,'NULL') + ' to
project ' + ISNULL(@project_number,'NULL') + ', segment:' +
ISNULL(@Segment,'NULL') + ', list:' + ISNULL(@list_number,'NULL')
END
END
FETCH NEXT FROM SparesListMaterialCursor INTO @Project_number,
@List_number, @material_number, @Segment, @Mark_Number, @Used_qty,
@Material_Exception_Code, @Lead_Time, @Spares_Type_Code, @Category_Code,
@Proprietary_Code, @Critical_Level, @Marks_Printed_Code, @Order_Group_Code,
@Qty_Formula_Code, @Spares_Indicator_Code, @Formula_Qty
END
CLOSE SparesListMaterialCursor
DEALLOCATE SparesListMaterialCursor
DECLARE @list_id as uniqueidentifier
DECLARE @material_id as uniqueidentifier
DECLARE @recommended_qty as int
DECLARE @Temp_Recommended_Qty as int
-- Add materials recommended qty
DECLARE SparesListMaterialRecommendedQtyCursor CURSOR LOCAL STATIC FOR
SELECT
SPARESUTILITY.PROJECT_NUMBER AS Project_number,
SPARESUTILITY.LIST_NUMBER AS List_number,
SPAREPARTSPARTS.PART_NUMBER AS Material_number,
SUM(SPAREPARTSPARTS.RECOMENDED_QUANTITY) AS Recommended_Qty
FROM PROJECTORDERSYSTEM.DBO.SPARESUTILITY SPARESUTILITY WITH (NOLOCK,
READUNCOMMITTED)
INNER JOIN PROJECTORDERSYSTEM.DBO.SPAREPARTSPARTS SPAREPARTSPARTS WITH
(NOLOCK, READUNCOMMITTED)
ON (SPAREPARTSPARTS.SPARESKEYID = SPARESUTILITY.SPARESKEYID)
WHERE SPARESUTILITY.PROJECT_NUMBER = @ProjectNumber
GROUP BY
SPARESUTILITY.PROJECT_NUMBER,
SPARESUTILITY.LIST_NUMBER,
SPAREPARTSPARTS.PART_NUMBER
OPEN SparesListMaterialRecommendedQtyCursor
FETCH NEXT FROM SparesListMaterialRecommendedQtyCursor INTO @Project_number,
@List_number, @material_number, @Recommended_qty
WHILE(@@FETCH_STATUS=0)
BEGIN
SELECT @material_id = material_id
FROM MATERIAL
WHERE material_number = @material_number
SELECT @list_id = SL.list_id
FROM SPARES_LIST SL
INNER JOIN PROJECT_SPARE_LISTS P
ON P.list_id = SL.list_id
WHERE P.project_number = @project_number AND SL.list_number =
@list_number
-- Does that material already exist in MATERIAL_RECOMMENDED_QTY for that
list?
-- If so, Insert. If not, Update by adding the prior value to the new
value.
SET @Temp_Recommended_Qty = NULL
SELECT @Temp_Recommended_Qty = @Temp_Recommended_Qty
FROM MATERIAL_RECOMMENDED_QTY
WHERE list_id = @list_ID AND material_id = @material_id
IF @Temp_Recommended_Qty IS NULL
INSERT INTO MATERIAL_RECOMMENDED_QTY
(material_id, list_id, recommended_qty, active, update_personid)
VALUES (@material_id, @list_id, @recommended_qty, 1, 'LEGACY')
ELSE
UPDATE MATERIAL_RECOMMENDED_QTY
SET recommended_qty = @Temp_Recommended_Qty + @recommended_qty
WHERE list_id = @list_ID AND material_id = @material_id
FETCH NEXT FROM SparesListMaterialRecommendedQtyCursor INTO
@Project_number, @List_number, @material_number, @Recommended_qty
END
CLOSE SparesListMaterialRecommendedQtyCursor
DEALLOCATE SparesListMaterialRecommendedQtyCursor
"Adam Machanic" <amachanic@hotmail._removetoemail_.com> wrote in message
news:%23XmuksbwEHA.1564@TK2MSFTNGP09.phx.gbl...
> Can you post your code as well as a narrative about what it's doing and
why?
>
> --
> Adam Machanic
> SQL Server MVP
> http://www.sqljunkies.com/weblog/amachanic
> --
>
>
> "Scott M. Lyon" <scott.RED.lyon.WHITE@rapistan.BLUE.com> wrote in message
> news:eZSsYobwEHA.3292@TK2MSFTNGP15.phx.gbl...
> > I've got a stored procedure that essentially consists of about a half
> dozen
> > CURSORs (one after the other, not nested), each of which processes some
> > data. Each CURSOR has a source that is a SELECT with at least one INNER
> JOIN
> > (which I cannot change).
> >
> >
> > I'm trying to run this stored procedure as a job on our SQL server (so
it
> > will run regardless of whether I'm there or not, or if my PC is on or
> not).
> >
> >
> > Here are the two major problems I'm having:
> >
> > 1) The job is locking my source database (despite the fact that it's a
> > database that I know is unchanging), making it impossible for me to run
> > multiple instances of the job simultaneously
> > 2) When the job is running, I cannot even go into Enterprise Manager,
and
> > the databas in question, and Management->Current Activity, as it locks
up
> my
> > machine (never coming back) - I suspect this may be related to the
locking
> > issue mentioned above.
> >
> >
> > First of all, I'm declaring the cursors as LOCAL STATIC.
> >
> > Second, for every FROM and JOIN, after the table name I'm including WITH
> > (NOLOCK, READUNCOMMITTED) to prevent locks. Obviously this isn't working
> as
> > planned.
> >
> >
> >
> > Can anyone offer suggestions what I can try to resolve both issues?
> >
> >
> > Thanks!
> >
> >
>
>
- Next message: Scott M. Lyon: "Re: Multiple problems with a running job"
- Previous message: Alejandro Mesa: "RE: Dropping constraints"
- In reply to: Adam Machanic: "Re: Multiple problems with a running job"
- Next in thread: Scott M. Lyon: "Re: Multiple problems with a running job"
- Reply: Scott M. Lyon: "Re: Multiple problems with a running job"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|
Loading