Parameter v StoredProcedure ktory urcuje stlpec pre filter   zodpovězená otázka

SQL, Databáze

Dobry den,

mam problém pri filtrovani databaze.

Ide o to, že uživatel si vyberie podla coho hladat - DropDown (je to ale stlpec v DB) a potom zadá hodnotu ktorou hladat.

V aplikacii ktoru programujem sú vsetky SQL prikazy uložené ako StoredProcedures na SQL serveri.

Nechcem to ani robit cez CASE lebo by sa musela vždy po pridani ci odobrani stlcov menit aj StoredPrecedura manualne.

Da sa to nejako programovo urobiť priamo v uloženej procedure ked posielam ako parameter MenoStlpca a hodnotu?

Tu je eqvivalent ulozenej procedury na SQL 2005.

USE [Personal]
GO
Script Date: 08/27/2010 07:49:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[GetOdbornostVsetci] 
	@MenoStlpca nvarchar(15),
	@Hodnota nvarchar(25),
AS
BEGIN
	SET NOCOUNT ON;

	SELECT 
		[OsCisloId], 
		[OsCislo], 
		[Meno], 
		[OrgJednotkaH], 
		[OrgJednotkaD], 
		[Profesia]
 	FROM [Prislusnici] 
	WHERE "@MenoStlpca" = @Hodnota
END

Do toho "@MenoStlpca" potrebujem nejako dostať hodnodu z parametera @MenoStlpca

Dakujem vopred za pomoc.

Uz sa s tym trapim dlhsie.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je důvod proč jsem pro zavedení funkcionálních parametrů. Tohle nijak snadno neuděláte.

Maximálně zavoláte příkaz pomocí "exec", například:

declare @cmd nvarchar(1000)
set @cmd = N'select .... from ... where [' + @column + '] = ...';
EXEC(@cmd)

Proto už z principu doporučuji LINQ2SQL nebo vlastní generování dotazů z aplikace.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

LINQ to SQL to samo o sobě taky nevyřeší, pokud ta procedure bude složitější. Vlastní generování dotazů z aplikace to vyřeší vždy, za cenu toho, že ztrácíme optimalizaci na straně serveru.

Pak ještě zbývá "prasárna" předávat do aplikace více sloupců a tam si vybrat.

Původní požadavek trochu zavání špatným návrhem aplikace, ale s funkcionálními parametry souhlasím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

LINQ to SQL tento problém vyřeší, pokud jsou filtry a omezení jednoduché (rovnost, nerovnost, like či join). To by mělo pokrýt většinu případů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ALTER PROCEDURE [dbo].[GetOdbornostVsetci]

@OsCislo nvarchar(15) = null,

@Menon varchar(25) = null,

@OrgJednotkaH int = null,

@OrgJednotkaD int = null,

@Profesia varchar(50) = null

AS

BEGIN

SET NOCOUNT ON;

SELECT

[OsCisloId],

[OsCislo],

[Meno],

[OrgJednotkaH],

[OrgJednotkaD],

[Profesia]

FROM [Prislusnici]

WHERE (@OsCislo = null or OsCislo = @OsCislo) and

(@Meno= null or Meno= @Meno) and

(@OrgJednotkaH= null or OrgJednotkaH= @OrgJednotkaH) and

(@OrgJednotkaD= null or OrgJednotkaD= @OrgJednotkaD) and

(@Profesia= null or Profesia= @Profesia)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback