как объединить различные параметры хранимой процедуры - PullRequest
1 голос
/ 04 июня 2010

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

CREATE PROCEDURE searchStudent
-- Add the parameters for the stored procedure here
@course int=null,
@branch int=null,
@admissionYear varchar(max)=null,
@passingYear varchar(max)=null,
@userName varchar(max)=null,
@sex varchar(max)=null,
@studyGap varchar(max)=null,
@firstName varchar(max)=null,
@lastName varchar(max)=null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE query STR DEFAULT null

IF @course IS NOT NULL
THEN query=
SELECT * FROM [tbl_students] WHERE 

END
GO

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

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Для этого вам, вероятно, потребуется использовать динамический SQL. Прежде всего, я очень рекомендую прочитать эту прекрасную статью. http://www.sommarskog.se/dynamic_sql.html

Ты динамический sql был бы что-то вроде этого;

   Declare @query varchar(max)

   Set @query = 'Select * From dbo.MyTable Where '

   If @Course Is Not Null
   Begin
    Set @query = @query + 'Course = ' + Convert(varchar(10), @Course)
   end

   If @Branch Is Not Null
   Begin
    Set @query = @query + ' and Branch = ' + Convert(varchar(10), @Branch )
   end

Это только пример! Вам нужно будет встроить некоторые проверки, чтобы убедиться, что у вас есть одно (и только одно) предложение Where, вы должны убедиться, что значения integer преобразованы в строковые значения правильно. Вы также должны убедиться, что параметры не имеют специальных символов, которые могут нарушить динамический SQL - как апостроф (')

Использование динамического SQL может быть болезненным и очень трудным для понимания.

Удачи!

2 голосов
/ 04 июня 2010

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

Условия динамического поиска в T-SQL Эрланда Соммарского

Он охватывает все проблемы и методы попыток написания запросов с несколькими необязательными условиями поиска. Это главное, что вам нужно беспокоиться, это не дублирование кода, а использование индекса. Если ваш запрос не может использовать индекс, он будет плохо сформирован. Можно использовать несколько методов, которые могут или не могут использовать индекс.

вот оглавление:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History
1 голос
/ 04 июня 2010

Извините, у меня проблемы с пониманием того, что вы спрашиваете. Вы имеете в виду, что потребитель sproc может указать произвольное подмножество параметров, и вы хотите отфильтровать их?

Исходя из вышесказанного, у вас есть 2 варианта.

1. используйте предложение where как-то так:

WHERE ([tbl_students].firstName = ISNULL(@firstname,firstName)
  AND ([tbl_students].lastName = ISNULL(@lastName ,lastName )

и т.д.. Это проверяет, имеет ли ваш параметр значение, и если да, то сравнивает его со столбцом. Если параметр равен нулю, он будет сравнивать столбец с самим собой, который никогда ничего не отфильтрует.

  1. используйте динамический sql в вашем sproc и просто включите строку предложения where, если вы хотите, чтобы параметр не был нулевым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...