у меня есть консультация:
Меня производит ошибка, создав мой store procedure, когда я перемещаю его ранг дат. Однако, если я только перемещаю его id проекта, функционируй хорошо, проблема, - когда я перемещаю ранг дат where
CREATE PROCEDURE [dbo].[PA_Control_horas_Proyecto]
@IdProyecto varchar(6),@Fecha1 date, @Fecha2 date
/*
EXEC [PA_Control_horas_Proyecto] '103569','15-09-2019','15-10-2019'
*/
------------------------------------------------------------------------------
------------------------------------------------------------------------------
as
begin
IF @Fecha1 is null
or @Fecha2 is null
or @Fecha1 > @Fecha2
return -1;
DECLARE @SQLDynamic NVARCHAR(MAX)-- STRING QUE CONTENDRA TODO
--DECLARE @FinalDate NVARCHAR(50)=right(@MesAño,4)+'-'+'01-'+left(@MesAño,2)-- creamos el año + el mes + el primer dia
--obtiene el primer dia del mes
;with CTE_DAY_Recursive as (
SELECT @Fecha1 as DayDINAMIC
union all
SELECT dateadd (day, +1, DayDINAMIC)
from CTE_DAY_Recursive
where DayDINAMIC < @Fecha2
)
SELECT @SQLDynamic=COALESCE(@SQLDynamic+',','')+'['+CAST(DayDINAMIC AS nvarchar(20))+']'
FROM CTE_DAY_Recursive --Obtenemos los registros
DECLARE @SQLFULL NVARCHAR(MAX)='
select * from
(
select
Id_Colaborador as ''DNI'',
Nombre_Colaborador as ''COLABORADOR'',
dbo.FU_Desc_Proyecto(Id_Unidad_Organizativa) as ''PROYECTO UO'',
Nro_Proyecto_Registro +'' ''+Descripcion_Proyecto_Registro as ''PROYECTO ASIGNADO'',
Fecha_Registro,
sum(Hora_Registro) as ''Hora_Registro''
from Sigeri
where Nro_Proyecto_Registro = '+@IdProyecto+' and Fecha_Registro>='+@Fecha1+' and Fecha_Registro<='+@Fecha2+'
group by Id_Colaborador,Nombre_Colaborador,Id_Unidad_Organizativa,Nro_Proyecto_Registro,Fecha_Registro,Descripcion_Proyecto_Registro
)s
pivot(
max(Hora_Registro)
for[Fecha_Registro] in --(select Fecha_Registro FROM Sigeri)
('+@SQLDynamic+') --Le pasamos los registros
)p'
EXEC(@SQLFULL)
end
Я попытался без ранга дат и функционируй в совершенство. Кроме этого я использую центр, чтобы превращать даты в колонны.
Сообщение ошибки, которую он показывает мне, - следующее
Los tipos de datos varchar y date son incompatibles con el operador add.
Привет я присоединяю тебя пример для того, чтобы ты увидел деталь эта в твоих датах, ты не можешь помещать это только так нужно реализовывать cast
Здесь ты, должно быть, делаешь изменение я присоединяю тебя пример.
where Nro_Proyecto_Registro = '''+@IdProyecto+''' and Fecha_Registro>='''+CAST(@Fecha1 AS nvarchar(50))+''' and Fecha_Registro<='''+CAST(@Fecha2 AS NVARCHAR(50))+'''
https://dbfiddle.uk/? rdbms=sqlserver_2017& fiddle=6dd4a8b50b0fca0b9a6983244149e8e0
Ты Сменил бы Print на EXEC, чтобы мочь выполнять это.
типов Привета
Востока один cГіdigo, что, того, чтобы быть взятым как пример, открывает двери в нее inyecciГіn SQL. Никогда они, должно быть, не прилагают стоимость их parГЎmetros. Всегда мы должны parametrizar консультации. Для этого, у нас есть sp_executesql
, которые он позволяет определять и посылать parГЎmetros в наши консультации.
Оставил пример с нескольким прогрессом относительно лучше prГЎcticas и формат.
CREATE PROCEDURE [dbo].[PA_Control_horas_Proyecto]
@IdProyecto varchar(6) ,
@Fecha1 date ,
@Fecha2 date ,
/*
EXEC [PA_Control_horas_Proyecto] '103569','15-09-2019','15-10-2019'
*/
------------------------------------------------------------------------------
------------------------------------------------------------------------------
AS
IF @Fecha1 is null
or @Fecha2 is null
or @Fecha1 > @Fecha2
RETURN -1;
DECLARE @SQLDynamic NVARCHAR(MAX);-- STRING QUE CONTENDRA TODO
WITH
E(n) AS(
SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
SELECT a.n FROM E a, E b
),
E4(n) AS(
SELECT a.n FROM E2 a, E2 b
),
cteTally(n) AS(
SELECT TOP(DATEDIFF(DD, @Fecha1, @Fecha2) + 1)
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 n
FROM E4
)
SELECT @SQLDynamic = COALESCE( @SQLDynamic + ',', '') + QUOTENAME(CONVERT( char(10), DATEADD( dd, n, @Fecha1), 120)) + CHAR(13) + CHAR(9)
FROM cteTally;
DECLARE @SQLFULL NVARCHAR(MAX)='
SELECT *
FROM(
SELECT
Id_Colaborador as ''DNI'',
Nombre_Colaborador as ''COLABORADOR'',
dbo.FU_Desc_Proyecto(Id_Unidad_Organizativa) as ''PROYECTO UO'',
Nro_Proyecto_Registro +'' ''+Descripcion_Proyecto_Registro as ''PROYECTO ASIGNADO'',
Fecha_Registro,
SUM(Hora_Registro) as ''Hora_Registro''
FROM Sigeri
WHERE Nro_Proyecto_Registro = @IdProyecto
AND Fecha_Registro >= @Fecha1
AND Fecha_Registro <= @Fecha2
GROUP BY Id_Colaborador,Nombre_Colaborador,Id_Unidad_Organizativa,Nro_Proyecto_Registro,Fecha_Registro,Descripcion_Proyecto_Registro
)s
PIVOT(
MAX(Hora_Registro)
FOR [Fecha_Registro] IN --(select Fecha_Registro FROM Sigeri)
('+@SQLDynamic+') --Le pasamos los registros
)p;';
--PRINT @SQLFULL
EXECUTE sp_executesql @SQLFULL, N'@IdProyecto varchar(6),@Fecha1 date, @Fecha2 date', @IdProyecto, @Fecha1, @Fecha2;
GO