Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Переменные в динамических запросах  [new]
Carp
Guest
Необходимо в динамическом запросе присвоить значение переменной.
Конструкция следующая:
@Doc_ID INT ,
@TblName VARCHAR(30)
....

DECLARE @Date DATETIME
EXEC ( 'SELECT @Date = Data FROM ' + @TblName + ' WHERE ID = ' + @Doc_ID )

Ругается: "Must declare the variable @Date"

В чем ошибка?

Заранее благодарен,
Carp.
3 окт 03, 11:31    [362428]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
В FAQ есть про это, но почему то он сейчас не работает. Короче, есть такая процедура sp_executesql, которая понимает параметры, но в BOL не документирована OUT параметров. Подожди, может FAQ поправят.
3 окт 03, 11:35    [362443]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
use Northwind


declare @param nvarchar(2000), @CompanyName nvarchar(2000), @query nvarchar(2000)

set @query = N'select @CompanyName = CompanyName from Customers where [CustomerID]=''ALFKI'''
set @param = N'@CompanyName nvarchar(2000) OUT'
EXECUTE sp_executesql @query, @param, @CompanyName OUT
select @CompanyName
3 окт 03, 11:41    [362463]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Dinni
Member

Откуда:
Сообщений: 40
а если так:

EXEC ( ' DECLARE @Date DATETIME
SELECT @Date = Data FROM ' + @TblName + ' WHERE ID = ' + @Doc_ID )
3 окт 03, 11:46    [362475]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Carp
Guest
To tpg
Ждем FAQ

To Павел Воронцов
Попробовал преобразовать под свою задачу:

DECLARE @Date DATETIME
DECLARE @Query NVARCHAR(250) , @Param NVARCHAR(15)

SET @Query = N'SELECT @Date = Data FROM ' + @TblName + ' WHERE ID = ' + CONVERT( VARCHAR ( 10) , @Doc_ID )
SET @Param = N'@Date DATETIME OUT'
EXECUTE sp_executesql @Query, @Param, @Date OUT

При выполнении ошибка: Formal parameter '@Date' was defined as OUTPUT but the actual parameter not declared OUTPUT.

To Dinni
Если написать так, то переменная @Date будет видна только для запроса, выполняемого в EXEC - "снаружи" использовать ее нельзя
3 окт 03, 12:04    [362521]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Carp
Guest
Ошибка найдена - когда выполняется EXEC, нет необходимости писать OUTPUT для переменной, которая возвращается.

Всем ОГРОМНОЕ спасибо за внимание и участие!)

С уважением,
Carp.
3 окт 03, 12:20    [362558]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Carp
Guest
Рано радовался - если убрать OUTPUT, переменной @Date ничего не присваивается...
3 окт 03, 12:26    [362572]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вообще то должно было проехать. А если @Date заменить на @D (вдруг шрифт съехал)?
3 окт 03, 12:35    [362597]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в динамических запросах  [new]
Carp
Guest
Теперь уже точно ошибка найдена! И, как всегда, в самом дурацком месте: когда я описывал переменную @Param, я задал слишком маленькую длину - 15 символов... И она обрезала "OUTPUT". Обнаружить это помог Ваш совет, tpg.

Еще раз спасибо!
3 окт 03, 12:40    [362603]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить