Home / Database & Server / Database & Server / Sql Server Stored Procedure condizionali
Mattepuffo

Sql Server Stored Procedure condizionali

Sql Server Stored Procedure condizionali

Oggi ho creato la mia SP condizionale.

Devo dire che creare SP in Sql Server è più facile e immediato che in MySQL.

Lo scenario è questo: sito web in Asp.NET e C# con GridView e 4 DropDownList che fanno da filtro.

I filtri possono essere anche composti; le opzioni erano due:

  • una SP per ogni condizione
  • una SP con IF - ELSE if

Ho scelto la seconda strada.

In pratica mi sono scritto una mia classe con un metodo al quale passo dei paramentri (che corrispondo ai valori delle DDL).

Il metodo lo carico tramite ObjectDataSource.

Questa è una SP di esempio:

USE [MYDB]
GO
/****** Object:  StoredProcedure [db].[select_audio]    Script Date: 05/31/2011 16:35:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [db].[select_audio]
@eraser int
AS
IF @eraser = 100
SELECT * FROM audio
ELSE
SELECT * FROM audio WHERE eraser = @eraser

In pratica setto un parametro; se è nullo eseguo la SELECT senza clausola WHERE; sennò aggiungo la clausola con il valore passato.

In questo caso la DDL è una, ma se ne possono mettere di più:

USE [MYDB]
GO
/****** Object:  StoredProcedure [db].[select_spot]    Script Date: 05/31/2011 16:37:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [db].[select_spot]
@eraser int,
@durata decimal
AS
IF @eraser = 100 AND @durata = 100
SELECT spot#, nome_file_spot, descrizione, eraser, durata_spot_old, tipi_spot.definizione_tipo_spot AS expr1, libreria_spot#, durata_spot
FROM spot INNER JOIN tipi_spot ON spot.tipo_spot#=tipi_spot.tipo_spot#
ELSE IF @eraser != 100 AND @durata = 100
SELECT spot#, nome_file_spot, descrizione, eraser, durata_spot_old, tipi_spot.definizione_tipo_spot AS expr1, libreria_spot#, durata_spot
FROM spot INNER JOIN tipi_spot ON spot.tipo_spot#=tipi_spot.tipo_spot#
WHERE eraser = @eraser
ELSE IF @eraser = 100 AND @durata != 100
SELECT spot#, nome_file_spot, descrizione, eraser, durata_spot_old, tipi_spot.definizione_tipo_spot AS expr1, libreria_spot#, durata_spot
FROM spot INNER JOIN tipi_spot ON spot.tipo_spot#=tipi_spot.tipo_spot#
WHERE durata_spot = @durata
ELSE
SELECT spot#, nome_file_spot, descrizione, eraser, durata_spot_old, tipi_spot.definizione_tipo_spot AS expr1, libreria_spot#, durata_spot
FROM spot INNER JOIN tipi_spot ON spot.tipo_spot#=tipi_spot.tipo_spot#
WHERE eraser = @eraser AND durata_spot = @durata

Di sicuro per fare tutta l'operazione esiste qualcosa di meglio (tipo usare Entity Framework), però al momento è l'unica cosa che mi è venuta in mente.