Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 11:48:52
|
| Insert into Stored Proc --------------------------------------------------------------------------------I can't seem to get this stored proc to run properly. It won't let me insert records into it. Any suggestions? Can someone tell me if something doesn't look right? I've been over this a million times!CREATE PROCEDURE TEST_PROC/* My Name*/ASBEGINSET NOCOUNT ONDECLARE @MAVG2003 AS MONEYSET @MAVG2003 = (SELECT AVG(PRICE) AS AVERAGEFROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003')CREATE TABLE #FORECAST(CUSTOMER_ID INT, FIRST_NAME VARCHAR(20),LAST_NAME VARCHAR(20),TOTAL_2003 MONEY,FORECAST_2004 MONEY,FORECAST_2005 MONEY)INSERT INTO #FORECASTSELECT C.CUSTOMER_ID,C.FIRST_NAME,C.LAST_NAME,TOTAL_2003 SUM(P.PRICE) AS TOTALYEAR,0,0FROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003'GROUP BY C.CUSTOMER_ID UPDATE #FORECASTSET FORECAST_2004 = TOTAL_2003 * (TOTAL_2003 / @MAVG2003)UPDATE #FORECASTSET FORECAST_2005 = FORECAST_2004 + (FORECAST_2004 * .0105)SELECT CUSTOMER_ID, TOTAL_2003, FORECAST_2004, FORECAST_2005FROM #FORECASTORDER BY TOTAL_2003 DESCDROP TABLE #FORECASTRETURN 0ENDGO |
|
|
X002548
Not Just a Number
15586 Posts |
Posted - 2007-08-21 : 12:15:44
|
| First, lose all of the nolock hintsSecond, what's this LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH?????You also have an incosistent grouping on the insertAlso, there is no need to do everything you are doing, you can just do a single SELECT by combining all of those components...For us to really help we will need DDL and sample data and expected resultsBrett8-)Hint: Want your questions answered fast? Follow the direction in this linkhttp://weblogs.sqlteam.com/brettk/archive/2005/05/25/5276.aspxAdd yourself!http://www.frappr.com/sqlteam |
 |
|
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2007-08-21 : 12:15:54
|
| Are you getting an error? Or is it just not returning what you expect? How about running the code outside of the stored proc to make this easier to troubleshoot:SET NOCOUNT ONDECLARE @MAVG2003 AS MONEYSET @MAVG2003 = (SELECT AVG(PRICE) AS AVERAGEFROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003')CREATE TABLE #FORECAST(CUSTOMER_ID INT, FIRST_NAME VARCHAR(20),LAST_NAME VARCHAR(20),TOTAL_2003 MONEY,FORECAST_2004 MONEY,FORECAST_2005 MONEY)INSERT INTO #FORECASTSELECT C.CUSTOMER_ID,C.FIRST_NAME,C.LAST_NAME,TOTAL_2003 SUM(P.PRICE) AS TOTALYEAR,0,0FROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003'GROUP BY C.CUSTOMER_ID UPDATE #FORECASTSET FORECAST_2004 = TOTAL_2003 * (TOTAL_2003 / @MAVG2003)UPDATE #FORECASTSET FORECAST_2005 = FORECAST_2004 + (FORECAST_2004 * .0105)SELECT CUSTOMER_ID, TOTAL_2003, FORECAST_2004, FORECAST_2005FROM #FORECASTORDER BY TOTAL_2003 DESCDROP TABLE #FORECASTTara KizerMicrosoft MVP for Windows Server System - SQL Serverhttp://weblogs.sqlteam.com/tarad/ |
 |
|
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 12:18:29
|
| I'm not getting an error, but it doesn't seem to be returning any results. Also, does the WITH(nolock) make a difference? I thought this was just good practice to have those. |
 |
|
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 12:19:44
|
| AHHHH!!!! ThisLEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OHshould be LEFT JOIN ASSESSMENT.DBO.ORDER_HEADER OH |
 |
|
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2007-08-21 : 12:21:57
|
| Removing the hints won't solve your problem, but you probably shouldn't have them in there. You should only put them in there if dirty reads are okay. You need to understand what it does before using them.Take each statement in your code one statement at a time to figure out what is going on. 1. Does this return the correct value:SET @MAVG2003 = (SELECT AVG(PRICE) AS AVERAGEFROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003')PRINT @MAVG20032. Does this insert the correct rows:CREATE TABLE #FORECAST(CUSTOMER_ID INT, FIRST_NAME VARCHAR(20),LAST_NAME VARCHAR(20),TOTAL_2003 MONEY,FORECAST_2004 MONEY,FORECAST_2005 MONEY)INSERT INTO #FORECASTSELECT C.CUSTOMER_ID,C.FIRST_NAME,C.LAST_NAME,TOTAL_2003 SUM(P.PRICE) AS TOTALYEAR,0,0FROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003'GROUP BY C.CUSTOMER_ID SELECT * FROM #FORECAST3. ...Tara KizerMicrosoft MVP for Windows Server System - SQL Serverhttp://weblogs.sqlteam.com/tarad/ |
 |
|
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2007-08-21 : 12:22:43
|
quote: Originally posted by Jennifer_Ann_28 AHHHH!!!! ThisLEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OHshould be LEFT JOIN ASSESSMENT.DBO.ORDER_HEADER OH
I don't understand why you weren't getting a syntax error then.Tara KizerMicrosoft MVP for Windows Server System - SQL Serverhttp://weblogs.sqlteam.com/tarad/ |
 |
|
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 12:23:36
|
| And I'm getting this error below when I run this section of the code on this lineTOTAL_2003 SUM(P.PRICE) AS TOTALYEAR,Msg 170, Level 15, State 1, Line 32Line 32: Incorrect syntax near 'P'.INSERT INTO #FORECASTSELECT C.CUSTOMER_ID,C.FIRST_NAME,C.LAST_NAME,TOTAL_2003 SUM(P.PRICE) AS TOTALYEAR,0,0FROM ASSESSMENT.DBO.CUSTOMER C WITH (NOLOCK)LEFT JOIN ASSESSMENT.DBO.ORDER)HEADER OH WITH (NOLOCK)ON OH.CUSTOMER_ID = C.CUSTOMER_IDLEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD WITH (NOLOCK)ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P WITH (NOLOCK)ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003'GROUP BY C.CUSTOMER_ID |
 |
|
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 12:36:22
|
| Thank you both for taking the time to look at this. tkizer, I did just as you suggested, and it seems something is wrong with my insert statements. However, I don't understand what X00 means by the inserts being inconsistant. |
 |
|
|
X002548
Not Just a Number
15586 Posts |
|
|
Jennifer_Ann_28
Starting Member
6 Posts |
Posted - 2007-08-21 : 12:47:01
|
| The total price of their orders for 2003. then 2004 and 2005 are the forecasts |
 |
|
|
X002548
Not Just a Number
15586 Posts |
|
|
X002548
Not Just a Number
15586 Posts |
Posted - 2007-08-21 : 13:04:44
|
This kind of what you really have...the part in red doesn't make sense because of the grouping..but see how you should be able to eliminate the temp table...now we just gotta make it make some senseCREATE PROCEDURE TEST_PROC @error int OUTPUT, @rowcount int OUTPUTASBEGINSET NOCOUNT ONDECLARE @MAVG2003 AS MONEY, @error int, @rowcount intSET @MAVG2003 = ( SELECT AVG(PRICE) AS AVERAGE FROM ASSESSMENT.DBO.CUSTOMER C LEFT JOIN ASSESSMENT.DBO.ORDER_HEADER OH ON OH.CUSTOMER_ID = C.CUSTOMER_ID LEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003') SELECT C.CUSTOMER_ID , C.FIRST_NAME , C.LAST_NAME , TOTAL_2003 , SUM(P.PRICE) AS TOTALYEAR , TOTAL_2003 * (TOTAL_2003 /@MAVG2003) AS FORECAST_2004 , TOTAL_2003 * (TOTAL_2003 /@MAVG2003) + (TOTAL_2003 * (TOTAL_2003 /@MAVG2003) * .0105) AS FORECAST_2005 FROM ASSESSMENT.DBO.CUSTOMER C LEFT JOIN ASSESSMENT.DBO.ORDER_HEADER OH ON OH.CUSTOMER_ID = C.CUSTOMER_ID LEFT JOIN ASSESSMENT.DBO.ORDER_DETAIL OD ON OD.ORDER_HEADER_ID = OH.ORDER_HEADER_ID LEFT JOIN ASSESSMENT.DBO.PRODUCTS P ON P.PRODUCT_ID = OD.PRODUCT_ID WHERE DATEPART(YYYY, OH.ORDER_DATE) = '2003' GROUP BY C.CUSTOMER_IDSELECT @error = @@Error, @rowcount = @@RowcountSET NOCOUNT OFFRETURNENDGODECLARE @error int, @rowcount intEXEC TEST_PROC @error OUTPUT, @rowcount OUTPUTSELECT @error, @rowcountGO Brett8-)Hint: Want your questions answered fast? Follow the direction in this linkhttp://weblogs.sqlteam.com/brettk/archive/2005/05/25/5276.aspxAdd yourself!http://www.frappr.com/sqlteam |
 |
|
|
|
|
|
|
|