Akshay malvankar Ответов: 1

Я не получаю результат от хранимой процедуры


я пытаюсь реализовать фильтр, я передаю параметр из своего кода
следующая строка, которую я отправляю в процедуру хранения

and tsn.SurveyorName=''Keval Kakdiya''


ниже приведена процедура моего магазина

процедура
(filterText varchar(8000)


SELECT DISTINCT tsd.State AS State, IFNULL(tsn.SurveyorName,0) SurveyorName, 
		 IFNULL(tni.NoOfInt, 0) NoOfInt, IFNULL(tsr.SampleReceived, 0) SampleReceived, 
         IFNULL(tce.CancelledEntries, 0) CancelledEntries,  
         IFNULL(ta.Approved, 0) Approved, IFNULL(td.DisApproved, 0) DisApproved
	 FROM tblsurveyordistrict tsd 
	 LEFT JOIN tblNoOfInt tni ON tsd.State = tni.State
	 LEFT JOIN tblSampleReceived tsr ON tsd.State = tsr.State
	 LEFT JOIN tblSurveyorName tsn ON tsd.State = tsn.State
	 LEFT JOIN tblCancelledEntries tce ON tsd.State = tce.State
	 LEFT JOIN tblApproved ta ON tsd.State = ta.State
	 LEFT JOIN tblDisapproved td ON tsd.State = td.State 
	 where 1=1 ' , filterText, '       // i am passing filter text here i dont know what this statement is doing
	 ORDER BY tsd.State;



я не получаю никакой записи та же самая строка выше я вставляю вот так она работает

SELECT DISTINCT tsd.State AS State, IFNULL(tsn.SurveyorName,0) SurveyorName, 
		 IFNULL(tni.NoOfInt, 0) NoOfInt, IFNULL(tsr.SampleReceived, 0) SampleReceived, 
         IFNULL(tce.CancelledEntries, 0) CancelledEntries,  
         IFNULL(ta.Approved, 0) Approved, IFNULL(td.DisApproved, 0) DisApproved
	 FROM tblsurveyordistrict tsd 
	 LEFT JOIN tblNoOfInt tni ON tsd.State = tni.State
	 LEFT JOIN tblSampleReceived tsr ON tsd.State = tsr.State
	 LEFT JOIN tblSurveyorName tsn ON tsd.State = tsn.State
	 LEFT JOIN tblCancelledEntries tce ON tsd.State = tce.State
	 LEFT JOIN tblApproved ta ON tsd.State = ta.State
	 LEFT JOIN tblDisapproved td ON tsd.State = td.State 
	 where 1=1 and tsn.SurveyorName=''Keval Kakdiya''    // this is working
	 ORDER BY tsd.State;


может ли кто-нибудь мне помочь

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

я перепробовал все, но это не работает

F-ES Sitecore

Вы не можете динамически добавлять предложения where к такому оператору. Либо постройте весь SELECT в виде строки и используйте EXEC для ее выполнения, либо используйте оператор switch\case\or для обслуживания списка известных возможных полей в предложении where. Если вы загуглите "t-sql dynamic where clause", вы найдете различные способы сделать это.

ZurdoDev

Где 1 = 1 означает, что все записи будут возвращены.
У вас есть 2 одиночные кавычки. Почему? Это говорит мне о том, что мы не видим ваш точный код, а вместо этого создаем строку sql и выполняем ее.

Вместо этого создайте хранимую процедуру и используйте параметры.

1 Ответов

Рейтинг:
10

Aarti Meswania

Здравствуйте Акшай,

Пожалуйста, пройдите через приведенный ниже код, надеюсь, это поможет

CREATE PROCEDURE spGetSurveyOrDistrict 
	@SurveryorName VARCHAR(8000)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	SELECT 
		 DISTINCT tsd.State AS State, IFNULL(tsn.SurveyorName,0) SurveyorName, 
		 IFNULL(tni.NoOfInt, 0) NoOfInt, IFNULL(tsr.SampleReceived, 0) SampleReceived, 
         IFNULL(tce.CancelledEntries, 0) CancelledEntries,  
         IFNULL(ta.Approved, 0) Approved, IFNULL(td.DisApproved, 0) DisApproved
	FROM tblsurveyordistrict tsd 
	LEFT JOIN tblNoOfInt tni ON tsd.State = tni.State
	LEFT JOIN tblSampleReceived tsr ON tsd.State = tsr.State
	LEFT JOIN tblSurveyorName tsn ON tsd.State = tsn.State
	LEFT JOIN tblCancelledEntries tce ON tsd.State = tce.State
	LEFT JOIN tblApproved ta ON tsd.State = ta.State
	LEFT JOIN tblDisapproved td ON tsd.State = td.State 
	where /*1=1 ---NOTE: this is not needed it's always gonna be true*/
		tsn.SurveyorName = @SurveryorName --THERE YOU GO..................
	ORDER BY tsd.State;
END
GO
/* 
To test above sp you can select below line and execute it, after creating the sp.
EXEC spGetSurveyOrDistrict @SurveryorName = 'Keval Kakdiya'    
*/


Примечание: Если вы хотите написать динамический запрос внутри sp, то вы можете сделать это со ссылкой Динамический учебник по SQL - введение, примеры и запросы - DataFlair[^] но я буду рекомендовать избегать динамических запросов, чтобы избежать проблем компиляции, производительности и SQL-инъекций.

Счастливого Кодирования! :)


Akshay malvankar

Эй, Арти Месвания спасибо за ваш ответ, смотрите выше код находится в mysql ok,
где /*1=1 ---Примечание: это не нужно, это всегда будет правдой*/
tsn.SurveyorName = @SurveryorName-вот так..................
над строкой не всегда будет surveyorname - это будет какой-то "поисковый стиринг"

а tsn.SurveyorName="Keval Kakdiya" // эта строка-всего лишь пример
это может быть другая строка, которая может быть добавлена к этому, например

и ТСН.SurveyorName="Кэвал Kakdiya" и государство = 'АБВ' // это может быть другой строкой

мой вопрос заключается в том, когда я передаю статический параметр
вот так, где 1=1 и tsn.SurveyorName="Keval Kakdiya" // его работа

но когда я передаю этот параметр через свой код в хранимую процедуру
а tsn.SurveyorName="Keval Kakdiya" // он не работает


существует любой способ, которым я могу отладить процедуру stroed, что actully end query is create in mysql workbench

Aarti Meswania

Привет Акшай,

Это называется "динамический запрос", для которого вы можете сослаться на ссылку, которую я упомянул выше. но я пытаюсь сказать, что это не безопасно, а также может дать вам результаты медленнее. в приведенной выше ссылке смотрите пример динамического запроса
Объявите @SQLString как NVARCHAR(MAX);
Набор @типа sqlstring = Н выбрать '+@columnnames+н' от ' + @tableName и;
EXEC(@SQLString);


Позвольте мне предложить другой подход: вы должны найти данные в таблице так, чтобы столбцы были фиксированными. вы хотите отфильтровать 10 столбцов - 15 столбцов или 100 столбцов, неважно, это нормально...
вы можете легко сделать это без динамического запроса.
Как же так???
ГДЕ
(tsn.SurveyorName= @SurveyorName или @SurveyorName равно нулю)
И (государство = @государству или @состояние имеет значение null)

вроде этого вы можете написать столько, сколько захотите.
и передайте значение определенному параметру(ам), который вы хотите, и избегайте передачи значения параметру(ам), который вы не хотите, и посмотрите на волшебство :) Это даст вам точный результат, который вы ищете. кроме того, это хороший и ремонтопригодный подход к написанию кода:)