:: Архив конференции по VFP до 2005 года
Динамический SQL с выходным параметром
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Застрял в довольно банальной вещи.
Раньше довольно много писал динамических запросов на MS SQL server , где часть параметров
приходит в процедуру сверху. Потребовалось, чтобы т1 параметр в динамическом запросе был OUTPUT Тут и загводка.
Обидно особенно , что если не класть этого в серверную процедуру, то на стороне фокса
такое делается мгновенно. Но вроде это не совсем оптимально
Вся процедура довольно большая
Привожу только проблемную часть
ALTER procedure newnum
@tbname varchar(30),
@flname varchar(30),
@wy int ,
@nnum INT OUTPUT,
@lnum int
as
declare @nm int
declare @nm1 int
if @wy=0
execute ('select '+@nnum+'=max('+@flname+') from '+@tbname)

Говорит ошибка рядом с =
Те если просто в query analiser написать
declare @tbname char(30)
declare @fldname char(30)
declare id int
exec ('select '+@id+'=max('+@fldname+') from '+@tbname)
Тоже говорит ошибка рядом с =
Без выходного параметра только с входными @tbname,@fldname
все прекрасно работает
Пробовал так извращаться
declare @tbname char(30)
declare @fldname char(30)
declare id int
exec ('declare idd int select @idd=max('+@fldname+') from '+@tbname)
set @id=@idd
select @id
Ошибки нет, но резульатат nul неверный при конкретных подстановках имен таблиц и полей




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
Hel!Riser

Сообщений: 10452
Откуда: Нижний Новгород
Дата регистрации: 11.03.2001
а если
SET @cSQLCommand='select @nnum=max('+@flname+') from '+@tbname
EXEC (@cSQLCommand)




------------------
Осторожно - глисты!
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
PaulWist

Сообщений: 14585
Дата регистрации: 01.04.2004
Привет, Володь.

Прверил, только что

declare @tbname char(30)
declare @fldname char(30)
declare @id char (10)
set @tbName = '..........'
set @fldName = 'ID'
set @id = '@id'
exec (N'declare @ID int select '+@id+'=max('+@fldname+') from '+@tbname + 'select @ID')

Вроде результат выдает нормальный




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Проверил, товй приер работает
Попробую сейчас его сунуть в процедура




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Нет, Паша
Все не так хорошо, как кажется
Выходной параметр не char а целый
В этут то перепенную результат динам запроса и не удается присвоить
Те проблема прежняя, достать присвоенную переменную наружу




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Ребята, вы чего? EXEC() - это отдельный пакет. Т.е. они просто не видит внешних переменных.

Вот здесь пример решения

www.sql.ru

Там в конце 2 пример по получению выходных значений в динамическом запросе.
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Владимир
Это и не только тут есть, а и в книжках по курсам с SQL server
Они все у меня есть
Только ни один из описанных примеров там не подходит
Бог с ним, будем совать все это со стороны VFP




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Ну, хорошо, "тупой" вариант, который я использовал, когда не знал об sp_executesql

IF Object_ID('tempDB..#test') IS NOT NULL DROP TABLE #test
CREATE TABLE #test (nnum VarChar(10))
EXEC (('INSERT INTO #test select max('+@flname+') from '+@tbname))
SELECT @nnum=nnum FROM #test

Подвариант того же самого

IF Object_ID('tempDB..#test') IS NOT NULL DROP TABLE #test
CREATE TABLE #test (nnum VarChar(10))
INSERT INTO #test EXEC ('select max('+@flname+') from '+@tbname)
SELECT @nnum=nnum FROM #test

Недостаток второго варианта в том, что в этом случае недопустима рекурсия. Нельзя использовать INSERT во ложенных EXEC()
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
PaulWist

Сообщений: 14585
Дата регистрации: 01.04.2004
2boba

Совсем забыл про sp_executesql (благо Владимир Максимов напомнил, вот твой пример и что тебя в нем не устраивает

declare @tbname nchar(30)
declare @fldname nchar(30)
declare @id int
declare @idd int
declare @str1 nchar(1000)
set @tbName = '............'
set @fldName = 'ID'
set @str1 = 'select @id=max(' + @fldname + ') from ' + @tbName
exec @ID = sp_executesql @str1, N'@ID int out', @ID = @IDD out
select @IDD

теперь вызывающий пакет имеет значение из вызванного батча.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Динамический SQL с выходным параметром
PaulWist

Сообщений: 14585
Дата регистрации: 01.04.2004
Вот причесанный

declare @tbname nchar(30)
declare @fldname nchar(30)
declare @id int
declare @str1 nchar(1000)
set @tbName = '...........'
set @fldName = 'ID'
set @str1 = 'select @id=max(' + @fldname + ') from ' + @tbName
exec sp_executesql @str1, N'@id int out', @id = @id out
select @ID




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика