Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический Sql в ХП, SQLServer, ADO 
:(
    Опции темы
nicka
Дата 9.7.2003, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Необходимо формировать WHERE строку в зависимости от введенных параметров в ХП
Как объявляеться внутренняя переменная в ХП?
Допустим я сформировала эту строку в переменную @whr
Как присоединить ее к запросу
SELECT * FROM table1 confused.gif?


PM MAIL   Вверх
vickr
Дата 9.7.2003, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.5.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Код

...
DECLARE @sql  varchar(500),
              @whr varchar(50)
/* здесь ты формируешь значение @whr */
....
SET @sql = 'SELECT something FROM somth_else WHERE ' + @whr
EXECUTE (@sql)

По-моему, так.
--------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:)
PM MAIL   Вверх
nicka
Дата 9.7.2003, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Круто!

Попробую, получться будет еще круче!
PM MAIL   Вверх
nicka
Дата 11.7.2003, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Все хорошо, только

Цитата
SET @sql = 'SELECT something FROM somth_else WHERE ' + @whr
EXECUTE (@sql)


данная ХП не возвращает никаких записей, когда я вызываю процедуру так

Set recordset = Cmm.execute, ведь должен же recordset заполняться выбранными записями!
Может что не так, взгляни на процедуру

Например процедурка у меня такая:
ALTER PROCEDURE dbo.pr_search_music
(
@music nvarchar(200)
)
AS
DECLARE @sql varchar(500),
@whr varchar(50)
begin

if ( @music <> 'NULL' )
SET @whr = @whr + ' AND music like ''' + @music + ''' '

SET @sql = 'SELECT id_music,music FROM dbo.music ' + @whr
EXECUTE (@sql)

end

PM MAIL   Вверх
vickr
Дата 12.7.2003, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.5.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Для чистоты эксперимента создал таблицу:
id_music int music varchar(50)
1 mus 1
2 mus 2
3 mus 3
4 The Cranberries
5 Roxette
6 Король и Шут
7 Крематорий
8 Mylene Farmer
9 Rammstein
Привожу еще раз твой код:
Код

ALTER PROCEDURE dbo.pr_search_music
(
@music nvarchar(200)
)
AS
DECLARE @sql varchar(500),
@whr varchar(50)
begin

if ( @music <> 'NULL' )
SET @whr = @whr + ' AND music like ''' + @music + ''' '

SET @sql = 'SELECT id_music,music FROM dbo.music ' + @whr
EXECUTE (@sql)

end

Внимание - правильный ответ smile.gif
Код

ALTER PROCEDURE dbo.pr_search_music
(
@music nvarchar(200)
)
AS
DECLARE @sql varchar(500),
@whr varchar(50)
begin

if ( @music <> 'NULL' )
 SET @whr = ' music like ''' + @music + ''' '

SET @sql = 'SELECT id_music, music FROM dbo.music WHERE ' + @whr
EXECUTE (@sql)

end

Воззвание вида
Код

exec pr_search_music '%Cran%'

выдает результат:
4 The Cranberries
Обрати внимание на строку
Код

SET @whr = @whr + ' AND music like ''' + @music + ''' '

А также на то, какое значение было присвоено @whr до нее. Правильно - никакое. Т.е. в конечном итоге мы выполняем EXECUTE(NULL) (т.к. в T-SQL все операции, содержащие в качестве одного из операндов NULL, возвращают его же) и ничего не получаем в ответ .
Для диагностики неисправностей smile.gif в хп рекомендую использовать либо отладку (не совсем тривиальный метод, кстати), либо (для небольших процедур) - диагностические SELECT-ы в ключевых местах, чтобы можно было быстро посмотреть (например, в Query Analyser), какие значения принимают те или иные переменные.
Первое, что я сделал - вставил в конце хп строчку
Код

select [@music]=@music, [@whr]=@whr, [@sql]=@sql


PS Кстати, а зачем здесь вообще формировать запрос динамически?
Можно же просто написать
Код

SELECT id_music, music FROM dbo.music WHERE music LIKE @music

Разве нет?

Это сообщение отредактировал(а) vickr - 12.7.2003, 14:33
--------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:)
PM MAIL   Вверх
nicka
Дата 14.7.2003, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Цитата
PS Кстати, а зачем здесь вообще формировать запрос динамически?
Можно же просто написать


Дело в том, что этот пример лишь часть кода образуемого динамически, именно поэтому я написала
SET @whr = @whr + ' AND music like ''' + @music + ''' ', с @whr

Просто будет форма с большим количеством параметров таблицы, то есть поиска и в зависимости от того что он введет, будет формироваться строка поиска, в SQL запросе - ясно?

Что ж попробую присвоить @whr начальное значение "", может тогда сработает
Вообще то я вызываю хп из модуля формы с помощью комманды ADO
Set recordset cmm.execute

В итоге в recordset -те должны вернуться найденные записи, которые потом и присваиваються recordset -ту формы
PM MAIL   Вверх
nicka
Дата 14.7.2003, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Цитата
EXECUTE (@sql)


Почему данное выполнение запроса не выводит данных в Unicode шрифтах?
PM MAIL   Вверх
nicka
Дата 15.7.2003, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



Проблема была в букве N
простонадо было
SET @whr = ' music like N''' + @music + ''' '
подставить букву N
Она оказываеться ищет в Unicode шрифтах,
всего делов то
А я мучился!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.