存储过程变量申明 Must declare the scalar variable "@var1".

来源:互联网 发布:网络运营总监岗位职责 编辑:程序博客网 时间:2024/05/16 01:59
http://forums.devshed.com/ms-sql-development-95/stored-procedure-must-declare-the-scalar-variable-var1t-403571.html
Stored procedure - Must declare the scalar variable "@var1".

Hi all, when i run this query i get the following error "Must declare the scalar variable "@var1". What am i doing wrong?

Code:
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[admin3c]-- Add the parameters for the stored procedure here@tableName varchar(100),@authorityId varchar(50)ASBEGINSET NOCOUNT ON;Declare @SQL VarChar(2000),@var1 varchar(50),@var2 int,@total intSELECT @SQL = 'select@var1 = name,@var2 = sum(age),@total = count(*)from dbo.'+@tableName+' where authority='+@authorityId+'group by name'Exec ( @SQL)select @total - @var2END

Reply With Quote
  #2  
Old November 20th, 2006, 06:28 AM
r937's Avatar
r937r937 is offline
SQL Consultant
Dev Shed God 41st Plane (25000 - 25499 posts)
 
Join Date: Feb 2003
Location: Toronto Canada
Posts: 25,352 r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)  
Time spent in forums: 3 Months 4 Days 14 h 14 m 27 sec 
Reputation Power: 3899
i'm not sure why you're getting that particular error message, however, there's still a problem in how you're approaching this --

your SELECT will return one row per name, i.e. there will be more than one row in the results

therefore, you cannot stuff the multiple values of name, sum(age), and count(*) into the scalar variables @var1, @var2, @total 

(at best, you'd manage to snag only the last ones)
__________________
r937.com | rudy.ca
please visit Simply SQL and buy my book 

Reply With Quote
  #3  
Old November 20th, 2006, 06:51 AM
mcal1mcal1 is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Nov 2006
Posts: 2 mcal1 User rank is Just a Lowly Private (1 - 20 Reputation Level)  
Time spent in forums: 19 m 53 sec 
Reputation Power: 0
Actually this query will only return one row. I modified the statement at little before i posted it here and probaly messed it up but its guareented to return only one row. Also the query works when i dont run it as an stored procedure. 
This works: 

Code:
declare @var1 varchar(50),@var2 int,@total intselect@var1 = something,@var2 = sum(case when something != '12' then 1 else 0 end),@total = count(*)from sometablewhere something = 1111group by somethingselect @total - @var2

Reply With Quote
  #4  
Old November 20th, 2006, 06:57 AM
r937's Avatar
r937r937 is offline
SQL Consultant
Dev Shed God 41st Plane (25000 - 25499 posts)
 
Join Date: Feb 2003
Location: Toronto Canada
Posts: 25,352 r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)r937 User rank is General 43rd Grade (Above 100000 Reputation Level)  
Time spent in forums: 3 Months 4 Days 14 h 14 m 27 sec 
Reputation Power: 3899
if you're gonna write the WHERE clause with only one "something" then you shouldn't even have it in the query -- remove it from the SELECT, and remove the GROUP BY

i still don't know why you're getting "Must declare the scalar variable "@var1"

Reply With Quote
  #5  
Old November 22nd, 2006, 11:15 AM
BillyDunnyBillyDunny is offline
Contributing User
Dev Shed Novice (500 - 999 posts)
 
Join Date: Sep 2003
Posts: 508 BillyDunny User rank is Sergeant (500 - 2000 Reputation Level)BillyDunny User rank is Sergeant (500 - 2000 Reputation Level)BillyDunny User rank is Sergeant (500 - 2000 Reputation Level)BillyDunny User rank is Sergeant (500 - 2000 Reputation Level)BillyDunny User rank is Sergeant (500 - 2000 Reputation Level)  
Time spent in forums: 4 Days 8 h 28 m 55 sec 
Reputation Power: 15
Quote:
Originally Posted by mcal1
Hi all, when i run this query i get the following error "Must declare the scalar variable "@var1". What am i doing wrong?


You're getting that error because of a scope issue. The variables @var1, @var2 etc are declared outside of dynamic SQL that you are executing. Read these articles on dynamic SQL.

http://support.microsoft.com/kb/262499

http://www.sqlteam.com/item.asp?ItemID=4619


Try something like this:
SQL Code:
Original - SQL Code
  1. DECLARE
  2.     @sql nvarchar(2000),
  3.     @var1 varchar(50),
  4.     @var2 int,
  5.     @total int
  6.  
  7. SELECT @sql = '
  8. select
  9.     @var1 = name,
  10.     @var2 = sum(age),
  11.     @total = count(*)
  12. from dbo.'+@tablename+'
  13. where authority='+@authorityid+'
  14. group by name'
  15.  
  16.  
  17. exec sp_executesql @sql,
  18.     N'@var1 varchar(50) output, @var2 int output, @total int output',
  19.     @var1 output, @var2 output, @total output
  20.  
  21.  
  22. SELECT @total - @var2