for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Архив конференции по VFP до 2005 года
   :: Помощь сайту :: 

Динамический SQL с выходным параметром
boba
[MVP]

Сообщений: 5105
Откуда: Медвежьи озера-
Дата: 22.03.05 06:38:35ОтветитьЦитировать
Застрял в довольно банальной вещи.
Раньше довольно много писал динамических запросов на 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

Сообщений: 10448
Откуда: Нижний Новгород
Дата: 22.03.05 07:00:54ОтветитьЦитировать
а если
SET @cSQLCommand='select @nnum=max('+@flname+') from '+@tbname  
  EXEC (@cSQLCommand)




------------------
Осторожно - глисты!
Ratings: 0 negative/0 positive

Re: Динамический SQL с выходным параметром
PaulWist
Автор

Сообщений: 12898
Дата: 22.03.05 07:03:56ОтветитьЦитировать
Привет, Володь.

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

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
[MVP]

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




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive

Re: Динамический SQL с выходным параметром
boba
[MVP]

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




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive

Re: Динамический SQL с выходным параметром
Владимир Максимов

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

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

www.sql.ru

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

Re: Динамический SQL с выходным параметром
boba
[MVP]

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




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive

Re: Динамический SQL с выходным параметром
Владимир Максимов

Сообщений: 13814
Откуда: Москва
Дата: 22.03.05 08:03:17ОтветитьЦитировать
Ну, хорошо, "тупой" вариант, который я использовал, когда не знал об 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
Автор

Сообщений: 12898
Дата: 22.03.05 08:31:38ОтветитьЦитировать
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
Автор

Сообщений: 12898
Дата: 22.03.05 08:33:53ОтветитьЦитировать
Вот причесанный

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: 54 Igor Korolyov nik_l  and Guests: 52


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