T-SQL. SELECT con LIKE un tanto extraña

19/10/2007 - 22:59 por Pablo Roca | Informe spam
Disculpas por el titulo de este mensaje, pero la verdad que no sabia como
titularlo.

Tengo una tabla (un menú) de esta manera:

CREATE TABLE [dbo].[x_menu](
[pk_x_menu_id] [smallint] IDENTITY(1,1) NOT NULL,
[mnumodulo] [char](3) NOT NULL,
[mnugrupo] [char](10) NOT NULL,
[mnutal] [char](2) NOT NULL,
[mnucodigo] [char](6) NOT NULL,
[mnutexto] [char](40) NOT NULL,
[mnutecla] [char](1) NOT NULL,
[mnunivel] [decimal](2, 0) NOT NULL,
[mnuclave] [char](8) NOT NULL,
[mnuclavev] [bit] NOT NULL,
[mnuprg] [char](12) NOT NULL,
[mnufin] [bit] NOT NULL,
[mnuparam] [char](40) NOT NULL,
CONSTRAINT [pk_x_menu_id] PRIMARY KEY CLUSTERED

Lo importante es:

En mnumodulo se guarda a que modulo pertenece el menu
En mnunivel se guarda el nivel de acceso (puede ser un numero entre 0 menor
nivel y 99 mayor nivel)

Quiero saber los registros que cumplan esta condicion:

Para un usuario determinado tengo un string que me indica los modulos y el
nivel de acceso de cada modulo de la siguiente manera:

modulo,nivel;...

ejemplo:

GES,20;TES,99;CON,50;PRO,99;COS,99;HEX,99;PER,99;FRI,99;

Sacar los modulos de un usuario lo puedo hacer facilmente con un
procedimiento almacenado de esta manera:


USE [GRECCO_BASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[x_menu_leer]
@modulo varchar(70)
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM x_menu WHERE @modulo LIKE '%'+mnumodulo+',%'
END

La Select es un tanto peculiar, ya que estoy acostombrado a poner los LIKE
al reves, pero funciona.

¿pero como podria hacer para sacar los registros considerando el nivel de
usuario por cada modulo, fijaros que el ejemplo tengo

GES,20;TES,99;CON,50;

Entonces quiero que me devuelva los registros con estas condiciones:

GES nivel 20
TES nivel 99
CON nivel 50

La verdad que estoy empezando seriamente a considerar en cambiar mi tabla de
usuarios y hacerme una tabla nueva de usuarios con modulos-niveles para que
sea mas facil esta consulta.

Bueno .. ¿Alguna idea?



Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
 

Leer las respuestas

#1 Gux (MVP)
19/10/2007 - 23:15 | Informe spam
No me gusta la implementación de poner un string con la forma:

GES,20;TES,99;CON,50;PRO,99;COS,99;HEX,99;PER,99;FRI,99;

porque no cumple siquiera con la Primera Forma Normal. No es que sea muy
malo no cumplir 1NF, pero en la práctica implica demasiadas operaciones de
manipulación y consultas muy ineficientes pues los índices no sirven
demasiado con ese tipo de desnormalizaciones.

Si aún hay tiempo de rediseñar, ver de normalizar esa info.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Pablo Roca" wrote:

Disculpas por el titulo de este mensaje, pero la verdad que no sabia como
titularlo.

Tengo una tabla (un menú) de esta manera:

CREATE TABLE [dbo].[x_menu](
[pk_x_menu_id] [smallint] IDENTITY(1,1) NOT NULL,
[mnumodulo] [char](3) NOT NULL,
[mnugrupo] [char](10) NOT NULL,
[mnutal] [char](2) NOT NULL,
[mnucodigo] [char](6) NOT NULL,
[mnutexto] [char](40) NOT NULL,
[mnutecla] [char](1) NOT NULL,
[mnunivel] [decimal](2, 0) NOT NULL,
[mnuclave] [char](8) NOT NULL,
[mnuclavev] [bit] NOT NULL,
[mnuprg] [char](12) NOT NULL,
[mnufin] [bit] NOT NULL,
[mnuparam] [char](40) NOT NULL,
CONSTRAINT [pk_x_menu_id] PRIMARY KEY CLUSTERED

Lo importante es:

En mnumodulo se guarda a que modulo pertenece el menu
En mnunivel se guarda el nivel de acceso (puede ser un numero entre 0 menor
nivel y 99 mayor nivel)

Quiero saber los registros que cumplan esta condicion:

Para un usuario determinado tengo un string que me indica los modulos y el
nivel de acceso de cada modulo de la siguiente manera:

modulo,nivel;...

ejemplo:

GES,20;TES,99;CON,50;PRO,99;COS,99;HEX,99;PER,99;FRI,99;

Sacar los modulos de un usuario lo puedo hacer facilmente con un
procedimiento almacenado de esta manera:


USE [GRECCO_BASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[x_menu_leer]
@modulo varchar(70)
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM x_menu WHERE @modulo LIKE '%'+mnumodulo+',%'
END

La Select es un tanto peculiar, ya que estoy acostombrado a poner los LIKE
al reves, pero funciona.

¿pero como podria hacer para sacar los registros considerando el nivel de
usuario por cada modulo, fijaros que el ejemplo tengo

GES,20;TES,99;CON,50;

Entonces quiero que me devuelva los registros con estas condiciones:

GES nivel 20
TES nivel 99
CON nivel 50

La verdad que estoy empezando seriamente a considerar en cambiar mi tabla de
usuarios y hacerme una tabla nueva de usuarios con modulos-niveles para que
sea mas facil esta consulta.

Bueno .. ¿Alguna idea?



Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com



Preguntas similares