MS SQL Stored Procedure Problem
MS SQL Stored Procedure Problem
I have a stored procedure that works fine on my local SQL Server (2005 or 2008 cant recall off hand) but fails when I try to create the procedure on the Production server (SQL 2000). Any help would be appreciated. TIA.
The stored procedure declaration is this:
/****** Object: StoredProcedure [dbo].[AssignPCSCheckNumbers] Script Date: 06/29/2009 13:12:24 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[AssignPCSCheckNumbers] ( @MonthEnd DATETIME, @Seed INT, @ManifestKey UNIQUEIDENTIFIER, @Threshold DECIMAL(9,2) ) AS SET NOCOUNT ON BEGIN --Create a temporary table variable to store our data DECLARE @MyTemp TABLE ( ProducerNumber VARCHAR(20), LastCheckDate DATETIME, Due DECIMAL(9,2) DEFAULT 0, Returned DECIMAL(9,2) DEFAULT 0 ) --Fill the table with a listing of producers from our PCSItems table and their ACH Status INSERT INTO @MyTemp ( ProducerNumber ) SELECT PCSItems.ProducerNumber FROM PCSItems LEFT JOIN Producer ON PCSItems.ProducerNumber = Producer.prodNum WHERE ISNULL(Producer.PayCommissionByACH,0) = 0 --UPDATE the table with the last time a check was printed for each --of these producers UPDATE @MyTemp SET LastCheckDate = ( SELECT ISNULL(MAX(EntryDate),'1/1/1901') FROM CommissionLedger WITH (NOLOCK) WHERE CommissionLedger.TransactionType = 1 AND CommissionLedger.ProducerNumber = [@MyTemp].ProducerNumber ) --update the table with the amount of comission owed to each producer UPDATE @MyTemp SET Due = ( SELECT IsNull(SUM(CommPaid),0) FROM ProducerComm WITH (NOLOCK) WHERE ProducerComm.CommApplies = [@MyTemp].ProducerNumber AND ProducerComm.EntryDate >= LastCheckDate AND ProducerComm.EntryDate <= @MonthEnd ) --update the table with the amount of commission returned by each producer UPDATE @MyTemp SET Returned = ( SELECT ISNULL(SUM(Amount), 0) FROM CommissionLedger WITH (NOLOCK) WHERE CommissionLedger.ProducerNumber = [@MyTemp].ProducerNumber AND CommissionLedger.EntryDate >= [@MyTemp].LastCheckDate AND CommissionLedger.EntryDate <= @MonthEnd ) --create a table to assist with our operations DECLARE @MyFinal TABLE ( ID INT IDENTITY(1,1), ProducerNumber VARCHAR(10) ) --just insert the producers that are owed an amount over a user specified --threshold INSERT INTO @MyFinal ( ProducerNumber ) SELECT ProducerNumber FROM @MyTemp WHERE (Due + Returned) > @Threshold --update our items with the check numbers finally =) UPDATE PCSItems SET CheckNumber = (SELECT (([@MyFinal].ID - 1) + @Seed) FROM @MyFinal WHERE [@MyFinal].ProducerNumber = PCSItems.ProducerNumber) SET NOCOUNT OFF END GO And the error the server responds with is this:
Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 35 The column prefix '@MyTemp' does not match with a table name or alias name used in the query. Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 45 The column prefix '@MyTemp' does not match with a table name or alias name used in the query. Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 55 The column prefix '@MyTemp' does not match with a table name or alias name used in the query. Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 55 The column prefix '@MyTemp' does not match with a table name or alias name used in the query. Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 79 The column prefix '@MyFinal' does not match with a table name or alias name used in the query. Msg 107, Level 16, State 2, Procedure AssignPCSCheckNumbers, Line 79 The column prefix '@MyFinal' does not match with a table name or alias name used in the query. Answer by SQLMenace for MS SQL Stored Procedure Problem
That should be created no problem on a 2000 box (and I verified by creating it on my sql 2000 box). Are you sure your database is not in 7.0 compatibility mode?
run
sp_helpdb 'YourDatabaseName'
and look if compatability is 80
Answer by Austin Salonen for MS SQL Stored Procedure Problem
This is loosely quoted from a question I asked awhile ago (Link) so if it works for you, upvote Mike L's response instead of mine.
If you use the Database Publishing Wizard to create scripts for your SPs, you can build them in 2005 and use it to deploy to 2000 letting the wizard take care of any compatability issues you may have.
Answer by devio for MS SQL Stored Procedure Problem
I was not aware that 2000 supported table variables, as I suspected in my first answer.
Now I tried in Query Analyzer and found that @table is handled differently from [@table] which results in an error message "invalid object name @table".
I suggest to remove the square brackets from the @ table names.
update:
This page indicates using a table alias might fix the problem. I just experimented with:
UPDATE @a SET a = a + b FROM @a INNER JOIN @b ON @a.a = @b.b which failed with an error. Rewriting as
UPDATE @a SET a = a + b FROM @a aa INNER JOIN @b bb ON aa.a = bb.b works. Hope it works for you too ;)
Answer by JeffO for MS SQL Stored Procedure Problem
It's not the @ notation that is causing the problem, it's the brackets @a not [@a].
Answer by Jeff Siver for MS SQL Stored Procedure Problem
It's been a while but I seem to remember SQL 2000 requiring you to use an alias when you are referencing the table in both the update statement and in a subquery. Hope this helps or you find the solution.
Answer by BigBoss for MS SQL Stored Procedure Problem
AFAIK tables in where clause can't referenced by name and you should their alias for this purpose, in MSSQL2000 book online for search condition we see:
:= { constant | scalar_function | [ alias. ] column | local_variable | ( expression ) | ( scalar_subquery ) | { unary_operator } expression | expression { binary_operator } expression } and as you see, there is no table or alias and it is only alias
Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:
Post a Comment