Como puntilla final voy a poner el procedimiento completo, que por cierto estaba liado también en otro tema del foro de SQL Server. Más o menos funciona como pretendía, aunque eso sí, no estoy nada seguro del rendimiento. En fin, allá va:
Código:
ALTER PROCEDURE PA_BuscaTaxa
(
@nome varchar(250),
@act bit = 1,
@cientifico bit = 1,
@usuario varchar(4) = '%',
@aut varchar(250) = '%',
@inicial bit = 0
)
AS
BEGIN
DECLARE @tabla TABLE (ID int, Nombre nvarchar(250),Autor nvarchar(250),Usuario varchar(4))
IF @cientifico = 1
BEGIN
INSERT INTO @tabla SELECT
(CASE WHEN tax.SinonimoDe IS NOT NULL THEN tax.SinonimoDe ELSE tax.ID END) AS "ID",
(CASE
WHEN tax.IDTipo = 14 THEN RTRIM(padre2.Nombre)+' '+RTRIM(padre1.Nombre)+' subsp. '+RTRIM(tax.Nombre)
WHEN tax.IDTipo = 13 THEN RTRIM(padre1.Nombre)+' '+RTRIM(tax.Nombre)
WHEN tax.IDTipo < 13 THEN RTRIM(tax.Nombre)
END)+(CASE WHEN tax.SinonimoDe IS NOT NULL THEN ' *' ELSE '' END) AS "Nombre",
Autor = (CASE WHEN tax.Autor IS NULL THEN ' ' ELSE tax.Autor END),
Usuario = (CASE WHEN tax.Usuario IS NULL THEN ' ' ELSE CONVERT(varchar(4),tax.Usuario) END)
FROM tabTaxa as tax
INNER JOIN
tabTaxa AS padre1 ON padre1.ID LIKE (CASE WHEN tax.IDPadre IS NOT NULL THEN tax.IDPadre ELSE NULL END)
LEFT JOIN
tabTaxa AS padre2 ON padre2.ID LIKE (CASE WHEN padre1.IDPadre IS NOT NULL THEN padre1.IDPadre ELSE NULL END)
WHERE
tax.Activado = @act
END
ELSE
BEGIN
INSERT INTO @tabla SELECT
vul.IDTaxa AS "ID",
vul.Nombre,
Autor = (CASE WHEN tax.Autor IS NULL THEN ' ' ELSE tax.Autor END),
Usuario = (CASE WHEN tax.Usuario IS NULL THEN ' ' ELSE CONVERT(varchar(4),tax.Usuario) END)
FROM nombresVulgares AS vul
INNER JOIN
tabTaxa AS tax ON tax.ID = vul.IDTaxa
WHERE
vul.Nombre LIKE '%'+@nome+'%'
AND
tax.Activado = @act
END
SELECT *
FROM @tabla
WHERE
Nombre LIKE (CASE WHEN @inicial = 1 THEN SUBSTRING(@nome,1,1)+'%' ELSE '%'+@nome+'%' END)
AND
RTRIM(Autor) LIKE @aut
AND
RTRIM(Usuario) LIKE @usuario
END
Como ya os he comentado sigo peleado con una parte del procedmiento, ya que no me devuelve los valores cuando IDPadre es nulo. Eso está en este
tema.
Un saludo y gracias de nuevo.