Member 13965122 Ответов: 1

Как я могу оптимизировать свой запрос ? и у меня есть такая ошибка : преобразование не удалось при преобразовании 'text' в int


Объявить таблицу @t_sup (
sup_id инт,
login_name varchar(128),
sup_level varchar(128),
process_code varchar(128)
)

--Объявить @contact_id как NVARCHAR(50); установить @contact_id = '7984';
--Объявить @imp_id как NVARCHAR(50); установить @imp_id = '202548';

Вставить в @t_sup (sup_id, login_name)
Выберите s.sup_id, COALESCE(ls.login_name, 'root')
От t_sup_supplier s
Левое соединение t_usr_login_securable ls на ls.sec_id=s.sec_id и ls.profil_code='sup_owner'
Левое соединение t_wfl_process_execution pe на pe.tdesc_name='t_sup_supplier' и pe.x_id=CAST(s.sup_id AS varchar(128))
Где именно s.imp_id=@imp_id --и pe.process_code равен нулю
Выберите * из @t_sup

Обновление ts
Набор sup_level=л.lvl_code
От @t_sup ts
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (
Выберите ts.sup_id, MAX(lvl_order) в качестве min_lvl_order
От @t_sup ts
Внутреннее соединение t_sup_supplier_level sl на sl.sup_id=ts.sup_id
Внутреннее соединение t_pbi_level l на l.lvl_code=sl.lvl_code
Группа по ts.sup_id
) Как ml на ml.sup_id=ts.sup_id
Внутреннее соединение t_pbi_level l на l.lvl_order=ml.min_lvl_order и l.dim_code='sup'

-- Декабрь
Объявите @process_code как VARCHAR(50)

SELECT @contact_id = COALESCE(usr.contact_id, 1)
От t_sup_supplier s
Внутреннее соединение t_usr_login как usr на usr.login_name = s.login_name_created
Где именно s.imp_id=@imp_id

Выберите @process_code = process_code из t_wfl_process_x, где tdesc_name = 't_sup_supplier' --и process_code не является нулевым

-- Mise à jour WFL SUPPLIER V2 - Etape Création (INI)
Если не существует (выберите * от t_wfl_worklist жилой внутреннее соединение t_sup_supplier s на ов.sup_id = жилой.x_id, где 1=1 и жилой.process_code = 'SUPPLIER_V2 и жилой.act_code = 'Ини' и жилой.x_id = С. sup_id и s.imp_id=@imp_id)
Вставить в t_wfl_worklist(process_code, x_id, tdesc_name, act_code, contact_id_performer,wli_date_ini, wli_date_val, wli_comment)
Выберите @process_code, С. sup_id, 't_sup_supplier', 'Ини', @contact_id, getdate(), то функцию getdate(), @contact_id+функции getdate()
От dbo.t_sup_supplier как внутреннее соединение t_wfl_worklist WFL на жилой.x_id = С. sup_id где s.imp_id=@imp_id и contact_id_performer = @contact_id и process_code = 'SUPPLIER_V2'--и process_code не null
Еще t_wfl_worklist обновить набор contact_id_performer = @contact_id, wli_date_val = getdate(), то wli_comment = @contact_id+функции getdate()
Из t_wfl_worklist внутреннее соединение t_sup_supplier как S на S.sup_id=t_wfl_worklist.x_id где x_id = С. sup_id и act_code = 'Ини' и S.imp_id= @imp_id и contact_id_performer = @contact_id

-- Я поставщик à жилой жур В2 - этапе проверки группы компаний (РСК)
Если не существует (выберите * из t_wfl_worklist wfl INNER JOIN t_sup_supplier s on s.sup_id = wfl.x_id LEFT JOIN t_sup_supplier_level lvl on s.sup_id=lvl.sup_id
Где 1=1 и process_code = 'SUPPLIER_V2 и act_code = 'РСК' и x_id = С. sup_id и s.imp_id=@imp_id и лвл.lvl_code &ЛТ;&ГТ; 'улет')

Что я уже пробовал:

я попытался отладить себя, но..... я не могу

Santosh kumar Pithani

Как мы можем найти проблему в этом запросе?Его проблема преобразования убедитесь, что типы данных, используемые для условия соединения, либо предоставляют некоторые тестовые данные.

Naga Sindhura

Левое соединение t_wfl_process_execution pe на pe.tdesc_name='t_sup_supplier' и pe.x_id=CAST(s.sup_id AS varchar(128))

что такое тип данных столбца pe.x_id int/varchar. Если это int, то почему вы конвертируете и затем сравниваете его с s.sup_id(CAST(s.sup_id AS varchar(128))).
или где-то в данных вы пытаетесь преобразовать данные varchar, которые содержат какие-то символы, и вы преобразуете эти данные в int.

1 Ответов

Рейтинг:
7

OriginalGriff

Сначала исправьте свои данные, а затем посмотрите на оптимизацию запросов.
Ошибка говорит: "Я не могу преобразовать это - это не число в Строковой форме", - поэтому вам нужно более внимательно изучить отчет об ошибке и выяснить, на какую строку и столбец запроса он жалуется.
Когда у вас есть это, вы можете узнать, какое значение он пытается преобразовать, а затем вернуться от этого к тому, откуда берутся данные, которые он пытается обработать.
Если это из БД, то почему вы храните числовые значения в текстовом поле? Измените свою базу данных, чтобы вы этого не делали.
Если это из пользовательского ввода, то почему вы не проверяете свои входные данные, прежде чем начать передавать их в SQL? Измените программное обеспечение презентации, чтобы всегда проверять и передавать полезные данные в правильных типах данных только с помощью параметризованных запросов. (Поскольку это означает, что ваше презентационное программное обеспечение вполне может объединять строки для создания SQL-запросов, а это очень опасно: Посмотрите SQL-инъекцию)
Если он из другого источника, то где он? Что же это должно было пройти? А почему бы и нет?

Мы можем;lt сделать все это для вас - это требует доступа к вашей БД и ошибочным данным, а у нас нет ни того, ни другого.


И когда дело доходит до оптимизации ваших запросов, сбрасывая его здесь с закомментированным кодом и без фактических попыток отступа или структурирования запроса, никто не помогает-я, конечно, даже не собираюсь пытаться понять, что это должно делать, а тем более как это делается в настоящее время - опять же, у нас нет доступа к вашим данным, поэтому мы не можем запустить его против фактической информации. Поэтому попробуйте взглянуть на план выполнения SQL и посмотреть, что он говорит о запросе и где могут быть какие-либо узкие места.


CHill60

1-голос против ... не потому, что вам нужны очки репутации (: -)), а потому, что другие читатели должны знать, что это хороший ответ!