Простой запрос в хранимой процедуре - PullRequest
4 голосов
/ 18 октября 2011

Необходимо создать хранимую процедуру, которая будет выполнять простой поиск по таблице, плюс иметь 3 параметра, первые два - диапазон дат, третий - если отличное от NULL, будет включено в WHERE, если равно NULLтогда не искать это значение, как я могу сделать этот поиск?

Ответы [ 8 ]

1 голос
/ 21 мая 2012
Where @parameter1 = ColA 
AND @parameter2 = ColB 
and ISNULL(@parameter3, ColC) = ColC
1 голос
/ 01 декабря 2011

попробуйте это ..
Create Prucedure test

@p1 int,@p2 int,@p3 nvarchar(50)

As

Begin

If @p3 is null

Select * from table where field1=@p1 and field2=@p2

Else
Select * from table where field1=@p1 and field2=@p2 and field3=@p3
End

Извините за неправильное форматирование, это потому, что я отправляю ответ с мобильного телефона

0 голосов
/ 01 декабря 2011

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

CREATE TABLE [dbo].[TrnMast](
    [TrnNo] [numeric](10, 0) NOT NULL,
    [AcYear] [int] NOT NULL,
    [Comp_Code] [varchar](5) NOT NULL,
    [InvNo] [varchar](20) NULL,
    [TrnDate] [datetime] NULL,
    [P_Code] [varchar](5) NULL,
    [Amount] [money] NULL,
    [Remark] [varchar](50) NULL
 CONSTRAINT [PK_TrnMast_1] PRIMARY KEY CLUSTERED 
(
    [TrnNo] ASC,
    [Comp_Code] ASC,
    [AcYear] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Теперь рассмотрим хранимую процедуру с 3 параметрами, имеющими два параметра диапазона дат и TrnNo Below.

CREATE PROCEDURE [dbo].[SP_TrnMast] 
    @FTrnDate SmallDateTime = Null,
    @TTrnDate SmallDateTime = Null,
    @AcYear Int
AS
Begin   
        Select * From TrnMast           
        Where (@FTrnDate Is Null Or TrnMast.TrnDate >= @FTrnDate) 
          And (@TTrnDate Is Null Or TrnMast.TrnDate <= @TTrnDate) 
          And TrnMast.AcYear = @AcYear 

End
0 голосов
/ 18 октября 2011

Я использую базу данных приключенческих работ.

 CREATE PROCEDURE upContactDetails
        @FirstName  [nvarchar](50),
        @LastName   [nvarchar](50),
        @MiddleName [nvarchar](50)
    AS
    BEGIN
    SET NOCOUNT ON;
    SELECT     Title
             , FirstName
             , MiddleName
             , LastName
             , EmailAddress
    FROM       Person.Contact
    WHERE (@MiddleName IS NULL or MiddleName = @MiddleName) 
          AND FirstName = @FirstName
          AND LastName  = @LastName 
    END
    GO
0 голосов
/ 18 октября 2011

Общая форма того, что вы пытаетесь выполнить, - это динамический запрос.См. Решение в этой проблеме оператор обновления не выполняет

0 голосов
/ 18 октября 2011

Попробуйте следующее. Обратите внимание, что если Column3 может иметь значение null, вам необходимо использовать функцию isnull () для имени столбца, а также нельзя сравнивать нулевые значения. Поэтому, если тип данных Column3 - int, вы можете использовать: and isnull (Column3, 0) = isnull (@ param3, isnull (Column3, 0)).

create procedure Test
    @param1 varchar(50),
    @param2 varchar(50),
    @param3 varchar(50) = null
as
begin
    select *
    from Table1
    where Column1 = @param1
    and Column2 = @param2
    and Column3 = isnull(@param3, Column3)
end
0 голосов
/ 18 октября 2011

Да!Вы можете сделать это, передав три переменные хост-программе и написав настроенный CURSOR SELECT, используя их.Тогда open the cursor и throw the resultset.Результаты вашего поиска теперь готовы к использованию.Если потребуется синтаксическая помощь, вернитесь с языком хоста и спецификациями, которые вы используете.Опубликуйте вызовы и решения, которые вы получили за то же самое, может помочь другим.

0 голосов
/ 18 октября 2011
WHERE @parameter IS NULL or field = @parameter
...