Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Must declare the scalar variable  [new]
JohnyMotorhead
Member

Откуда: Archangelsk, Russia
Сообщений: 32
Всем привет!!

Есть 2 таблицы - Passwords и Employee, которые связаны по ID.
Далее я делаю проверку логина и пароля в таблице Passwords, получаю id пользователя и по нему хочу получить данные из таблицы Employee.

пишу такую процедуру

Alter procedure GetRole
(@nick varchar(50), @pass varchar(50))
as
Declare @ident integer
Declare @sqlt nvarchar(250)

set @sqlt = 'Select @ident=Passwords.UserId from Passwords whwre Passwords.Nick=''' + @nick + ''' and Passwords.Pass = ''' + @pass + ''''
exec sp_executesql @sqlt, N'@ident integer out', @ident output

set @sqlt = 'Select * from Employee WHERE Employee.ID = @ident'
exec sp_executesql @sqlt

и получаю ошибку 'Must declare the scalar variable @ident'
Почему выскакивает ошибка, если переменная @ident объявлена?

При чем если во 2й части кода писать так, то все работает
Select * from Employee Where Employee.ID = @ident

Это страна Божьего Благоволенья, не водите по ней как по аду!
14 авг 11, 10:33    [11116112]     Ответить | Цитировать Сообщить модератору
 Re: Must declare the scalar variable  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35373
Блог
В вашей процедуре динамический sql не нужен
14 авг 11, 10:41    [11116124]     Ответить | Цитировать Сообщить модератору
 Re: Must declare the scalar variable  [new]
JohnyMotorhead
Member

Откуда: Archangelsk, Russia
Сообщений: 32
Критик
Объясните тогда пожалуйста, как можно написать?

вобще то что я написал - это часть задачи. у меня 4 таблицы:
Компания - Отделы - Пользователи - Пароли

т.е. используя динамические запросы я хочу выйти на таблицу Компания. может конечно подход и не правильный, но пока лучшего не придумал.
14 авг 11, 10:45    [11116132]     Ответить | Цитировать Сообщить модератору
 Re: Must declare the scalar variable  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
JohnyMotorhead ,

Динамика тут совершенно ни к чему.
select
 e.*
from
 Passwords p join
 Employee e on e.ID = p.UserId
where
 p.Nick = @nick and p.Pass = @pass
14 авг 11, 11:19    [11116160]     Ответить | Цитировать Сообщить модератору
 Re: Must declare the scalar variable  [new]
iljy
Member

Откуда:
Сообщений: 8711
JohnyMotorhead
и получаю ошибку 'Must declare the scalar variable @ident'
Почему выскакивает ошибка, если переменная @ident объявлена?

При чем если во 2й части кода писать так, то все работает
Select * from Employee Where Employee.ID = @ident

Все очень естественно: динамический скуль - это отдельная область видимости, и переменные, обявленные в процедуре, внутри динамики не видны. При первом вызове sp_executesql вы переменную туда передаете как параметр, а при втором - почему-то нет.
Но динамика вам тут действительно ну совсем не нужна. Она вообще нужна крайне редко.
14 авг 11, 11:23    [11116165]     Ответить | Цитировать Сообщить модератору
 Re: Must declare the scalar variable  [new]
JohnyMotorhead
Member

Откуда: Archangelsk, Russia
Сообщений: 32
спасибо всем за отзывы, особенно invm!
14 авг 11, 13:31    [11116265]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить