Cita:
Iniciado por GeriReshef Supongo que el problema es que cuando filtras los resultados utilizando el Where - el sistema enumera las filas de nuevo.
La solución puede ser más o menos así:
Código SQL:
Ver originalWITH T AS
(SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER() OVER(Partition BY anno ORDER BY codigo) AS VARCHAR),6) codigochar,
*
FROM libreta_topograf2)
SELECT *
FROM T
WHERE tipo_obra='xxxx';
Espero que te sirva de ayuda.
Hola nuevamente mira cambio la estructura de la BD ahora es asi:
Código SQL:
Ver originalCREATE TABLE libreta_topograf(
codigo INT IDENTITY PRIMARY KEY,
/*codigochar as 'Proy'+ right('00000000'+cast(codigo as varchar(12)),6)persisted,*/
descripcion text,
tipo_obra VARCHAR(180),
sector VARCHAR(100) NOT NULL,
anno datetime NOT NULL,
codlugar INT CONSTRAINT fk_codlugar FOREIGN KEY
REFERENCES lugar_libreta_topograf(codlugar)
);
GO
CREATE TABLE lugar_libreta_topograf(
codlugar INT IDENTITY PRIMARY KEY,
nombre VARCHAR(80),
descrilugar text
);
GO
Y lo que me has indicado sobre usar With funca como si fuese una consulta normal; ahora lo quise implementar en un Procedimiento Almacenado:
Código SQL:
Ver originalALTER PROCEDURE likesector_dat_lib_topograf
@nsector VARCHAR(100),
@msg AS VARCHAR(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN Tran likesector
BEGIN Try
WITH T AS
(SELECT 'Proy'+RIGHT('00000'+CAST(ROW_NUMBER()
OVER(Partition BY codlugar,YEAR(anno) ORDER BY codlugar,
YEAR(anno)) AS VARCHAR),6) codigochar,
*
FROM libreta_topograf)
SELECT T.codigo,T.codigochar,T.descripcion,T.tipo_obra,T.sector,lu.nombre,T.anno
FROM T INNER JOIN lugar_libreta_topograf lu ON lu.codlugar=T.codlugar
WHERE T.sector LIKE @nsector + '%'
SET @msg = 'Si existen registros.'
COMMIT TRAN likesector
END try
BEGIN Catch
SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la línea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.'
ROLLBACK TRAN likesector
END Catch
END
GO
Pero me marca este error:
Sintaxis incorrecta junto a la palabra clave 'with'. Si esta instrucción es una expresión de tabla común o una cláusula xmlnamespaces, la instrucción anterior debe terminarse con punto y coma (;).