Ошибка, создав store procedure с рангом дат?

у меня есть консультация:

Меня производит ошибка, создав мой 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.
0
задан 06.11.2019, 18:50
2 ответа

Привет я присоединяю тебя пример для того, чтобы ты увидел деталь эта в твоих датах, ты не можешь помещать это только так нужно реализовывать 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, чтобы мочь выполнять это.

типов Привета

-1
ответ дан 01.12.2019, 12:30

Востока один 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
1
ответ дан 01.12.2019, 12:30