Ошибка, связанная с хранимой процедурой - PullRequest
0 голосов
/ 15 апреля 2009
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[rptGGM]
(
    @FromDate datetime,
    @ToDate datetime,
    @PartyName varchar(50),
    @Type int
)

As
DECLARE @WhrStr VarChar(500)

SET @WhrStr = 
    CASE @Type
    WHEN 1 THEN
        ' And E.ATAAir between '+ @FromDate +' And '+@ToDate

    WHEN 2 THEN
        ' And D.ATASea between '+ @FromDate+ ' And '+@ToDate
    END
exec
(
'SELECT 
         A.FileNumber As [File No],
         S.POString As [PO Numbers],
         G.PartyName As [Exporter Name],
         C.CargoDesc As [Cargo Description],
         Dbo.ActualDate(A.ETA) As ETA,
         Dbo.ActualDate(IsNull(E.ATAAir, D.ATASea)) As ATA,
        S.SIString As [Supplier Invoices],
D.VesselName As [Vessel Name],
      D.VoyageNo As [Voyage No],
        dbo.PackCntDetails(A.FileID) As [Pk/Cnt Details]

FROM
    FileMain A

LEFT JOIN SIPOString S ON S.FileID=A.FileID
LEFT JOIN Party G ON G.PartyID = A.ExporterID
INNER JOIN Cargo C ON C.FileID = A.FileID
LEFT JOIN FileSea D ON D.FileID = A.FileID
LEFT JOIN FileAir E ON E.FileID = A.FileID

WHERE   
     G.PartyName='+@PartyName +' '+@WhrStr


)

При выполнении вышеуказанной процедуры появляется следующая ошибка Сообщение 241, Уровень 16, Состояние 1, Процедура rptGGM, Строка 12 Преобразование не удалось при преобразовании даты и времени из символьной строки. Может кто-нибудь помочь решить ошибку.

Ответы [ 4 ]

2 голосов
/ 15 апреля 2009

Это было бы намного проще, чем простой запрос без EXEC. Почему вы завернули все это в EXEC?

1 голос
/ 15 апреля 2009

Использование динамического SQL - очень плохая практика, поскольку он не только может не работать из-за проблем преобразования и длины данных, но также допускает внедрение SQL.

Используйте правильный запрос, подобный этому:

SELECT 
         A.FileNumber As [File No],
         S.POString As [PO Numbers],
         G.PartyName As [Exporter Name],
         C.CargoDesc As [Cargo Description],
         Dbo.ActualDate(A.ETA) As ETA,
         Dbo.ActualDate(IsNull(E.ATAAir, D.ATASea)) As ATA,
        S.SIString As [Supplier Invoices],
D.VesselName As [Vessel Name],
      D.VoyageNo As [Voyage No],
        dbo.PackCntDetails(A.FileID) As [Pk/Cnt Details]

FROM
    FileMain A

LEFT JOIN SIPOString S ON S.FileID=A.FileID
LEFT JOIN Party G ON G.PartyID = A.ExporterID
INNER JOIN Cargo C ON C.FileID = A.FileID
LEFT JOIN FileSea D ON D.FileID = A.FileID
LEFT JOIN FileAir E ON E.FileID = A.FileID

WHERE   
     G.PartyName=@PartyName AND
     (
           ((@Type = 1) And (E.ATAAir Between @FromDate And @ToDate))
     Or
           ((@Type = 2) And (E.ATASea Between @FromDate And @ToDate))
     )
0 голосов
/ 15 апреля 2009

вам нужно сделать явное приведение от datetime к varchar при построении @WhrStr. Должно работать следующее:

CAST(@FromDate as varchar)
0 голосов
/ 15 апреля 2009

Вы должны указать значения даты и времени

...
WHEN 1 THEN
    ' And E.ATAAir between '''+ CAST(@FromDate AS varchar(30)) +''' And '''+CAST(@ToDate AS varchar(30)) + ''''

WHEN 2 THEN
    ' And D.ATASea between '''+ CAST(@FromDate AS varchar(30))+ ' And '''+CAST(@ToDate AS varchar(30)) + ''''
END
...

Вы также будете иметь ошибку позже около @partyname:

...
WHERE   
     G.PartyName='''+@PartyName +''' '+@WhrStr

Редактировать: Добавлено CAST!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...