Hej, jag har fått en hyffsat stor SP på halsen. Den är tydligen nyligen översatt från "vanlig" sql till SP-format. DB är sql server 2000.
Dock får jag ett fel när den körs.
[Microsoft][ODBC SQL Server Driver][SQL Server]The column prefix 'P'
does not match with a table name or alias name used in the query.
/xxx.asp, line 49
rad 49 ser ut såhär: oRS.NextRecordset
SPn ser ut såhär:
CREATE PROCEDURE [dbo].[spReportFlags]
@CenterID int,
@Datefrom Varchar(50) = Null,
@Dateto Varchar(50) = Null,
@OrderBy varchar(50) = 'Flag',
@OrderDir varchar(4) = 'ASC'
AS
DECLARE @QueryAll varchar(2000)
SET @QueryAll = ''
Set @QueryAll = @QueryAll + 'SELECT DISTINCT COUNT(P.ProjectID) AS countAll '
Set @QueryAll = @QueryAll + 'From Project P '
Set @QueryAll = @QueryAll + 'Inner Join Projectowner Po On Po.Projectid = P.Projectid '
Set @QueryAll = @QueryAll + 'Left Join Projectnote Pn On Po.Projectid = Pn.Projectid '
Set @QueryAll = @QueryAll + 'WHERE P.CenterID = ' + CAST(@CenterID AS varchar(6)) + ' '
If @Datefrom IS NOT NULL And @Dateto IS NOT NULL
Begin
Set @QueryAll = @QueryAll + 'and (Pn.Projectnotedate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''' Or P.Firstvisitdate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''') '
End
Else
Begin
If @Datefrom IS NOT NULL
Begin
Set @QueryAll = @QueryAll + 'and (Pn.Projectnotedate >= ''' + @Datefrom + ''' Or P.Firstvisitdate >= ''' + @Datefrom + ''') '
End
If @Dateto IS NOT NULL
Begin
Set @QueryAll = @QueryAll + 'and (Pn.Projectnotedate <= ''' + @Dateto + ''' Or P.Firstvisitdate <= ''' + @Dateto + ''') '
End
End
EXEC(@QueryAll)
DECLARE @Query varchar(2000)
SET @Query = ''
Set @Query = @Query + 'SELECT FlagID, CenterID, Flag, '
Set @Query = @Query + '('
Set @Query = @Query + 'SELECT DISTINCT COUNT(lPF.ProjectID) '
Set @Query = @Query + 'From tblLinkProjectFlag lPF '
Set @Query = @Query + 'Inner Join Projectowner Po On Po.Projectid = lPF.Projectid '
Set @Query = @Query + 'Left Join Projectnote Pn On Po.Projectid = Pn.Projectid '
Set @Query = @Query + 'WHERE FlagID = tblFlag.FlagID '
If @Datefrom IS NOT NULL And @Dateto IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''' Or P.Firstvisitdate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''') '
End
Else
Begin
If @Datefrom IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate >= ''' + @Datefrom + ''' Or P.Firstvisitdate >= ''' + @Datefrom + ''') '
End
If @Dateto IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate <= ''' + @Dateto + ''' Or P.Firstvisitdate <= ''' + @Dateto + ''') '
End
End
Set @Query = @Query + ') AS countProject '
Set @Query = @Query + 'FROM tblFlag '
Set @Query = @Query + 'WHERE CenterID = ' + CAST(@CenterID AS varchar(6)) + ' '
Set @Query = @Query + 'ORDER BY ' + @OrderBy + ' ' + @OrderDir
EXEC(@Query)
DECLARE @QueryNone varchar(2000)
SET @QueryNone = ''
Set @QueryNone = @QueryNone + 'SELECT DISTINCT COUNT(P.ProjectID) AS countNone '
Set @QueryNone = @QueryNone + 'From Project P '
Set @QueryNone = @QueryNone + 'Inner Join Projectowner Po On Po.Projectid = P.Projectid '
Set @QueryNone = @QueryNone + 'Left Join Projectnote Pn On Po.Projectid = Pn.Projectid '
Set @QueryNone = @QueryNone + 'WHERE P.CenterID = ' + CAST(@CenterID AS varchar(6)) + ' '
Set @QueryNone = @QueryNone + 'AND P.ProjectID NOT IN(SELECT ProjectID FROM tblLinkProjectFlag WHERE CenterID = ' + CAST(@CenterID AS varchar(6)) + ') '
If @Datefrom IS NOT NULL And @Dateto IS NOT NULL
Begin
Set @QueryNone = @QueryNone + 'and (Pn.Projectnotedate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''' Or P.Firstvisitdate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''') '
End
Else
Begin
If @Datefrom IS NOT NULL
Begin
Set @QueryNone = @QueryNone + 'and (Pn.Projectnotedate >= ''' + @Datefrom + ''' Or P.Firstvisitdate >= ''' + @Datefrom + ''') '
End
If @Dateto IS NOT NULL
Begin
Set @QueryNone = @QueryNone + 'and (Pn.Projectnotedate <= ''' + @Dateto + ''' Or P.Firstvisitdate <= ''' + @Dateto + ''') '
End
End
EXEC(@QueryNone)
GO
Mina egna efterforskningar tyder på att det är för att P använda i sub-queries och att det inte är legalt i SQL server 2000. Stämmer detta och hur skriver jag isf om den?
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]SELECT DISTINCT COUNT(P.ProjectID) AS countAll From Project P Inner Join Projectowner Po On Po.Projectid = P.Projectid Left Join Projectnote Pn On Po.Projectid = Pn.Projectid WHERE P.CenterID = 94 and (Pn.Projectnotedate Between '2003-05-06' And '2007-03-03' Or P.Firstvisitdate Between '2003-05-06' And '2007-03-03')
Om vi printar nästa ser det ut så här:
[Microsoft][ODBC SQL Server Driver][SQL Server]SELECT FlagID, CenterID, Flag, (SELECT DISTINCT COUNT(lPF.ProjectID) From tblLinkProjectFlag lPF Inner Join Projectowner Po On Po.Projectid = lPF.Projectid Left Join Projectnote Pn On Po.Projectid = Pn.Projectid WHERE FlagID = tblFlag.FlagID and (Pn.Projectnotedate Between '2003-05-06' And '2007-03-03' Or P.Firstvisitdate Between '2003-05-06' And '2007-03-03') ) AS countProject FROM tblFlag WHERE CenterID = 94 ORDER BY Flag ASC
Och tar jag bort den printen får jag samma felmeddelande igen:
[Microsoft][ODBC SQL Server Driver][SQL Server]The column prefix 'P' does not match with a table name or alias name used in the query.
[Microsoft][ODBC SQL Server Driver][SQL Server]SELECT FlagID, CenterID, Flag, (SELECT DISTINCT COUNT(lPF.ProjectID) From tblLinkProjectFlag lPF Inner Join Projectowner Po On Po.Projectid = lPF.Projectid Left Join Projectnote Pn On Po.Projectid = Pn.Projectid WHERE FlagID = tblFlag.FlagID and (Pn.Projectnotedate Between '2003-05-06' And '2007-03-03' Or P.Firstvisitdate Between '2003-05-06' And '2007-03-03') ) AS countProject FROM tblFlag WHERE CenterID = 94 ORDER BY Flag ASC
Jag försåt varför felet blir som det blir, det finns ingen referens till Project kolumnen i from av ett P. Men hur ska jag skriva om frågan? :)
Det är alltså denna del i SPn som strular:
DECLARE @Query varchar(2000)
SET @Query = ''
Set @Query = @Query + 'SELECT FlagID, CenterID, Flag, '
Set @Query = @Query + '('
Set @Query = @Query + 'SELECT DISTINCT COUNT(lPF.ProjectID) '
Set @Query = @Query + 'From tblLinkProjectFlag lPF '
Set @Query = @Query + 'Inner Join Projectowner Po On Po.Projectid = lPF.Projectid '
Set @Query = @Query + 'Left Join Projectnote Pn On Po.Projectid = Pn.Projectid '
Set @Query = @Query + 'WHERE FlagID = tblFlag.FlagID '
If @Datefrom IS NOT NULL And @Dateto IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''' Or P.Firstvisitdate Between ''' + @Datefrom + ''' And ''' + @Dateto + ''') '
End
Else
Begin
If @Datefrom IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate >= ''' + @Datefrom + ''' Or P.Firstvisitdate >= ''' + @Datefrom + ''') '
End
If @Dateto IS NOT NULL
Begin
Set @Query = @Query + 'and (Pn.Projectnotedate <= ''' + @Dateto + ''' Or P.Firstvisitdate <= ''' + @Dateto + ''') '
End
End
Set @Query = @Query + ') AS countProject '
Set @Query = @Query + 'FROM tblFlag '
Set @Query = @Query + 'WHERE CenterID = ' + CAST(@CenterID AS varchar(6)) + ' '
Set @Query = @Query + 'ORDER BY ' + @OrderBy + ' ' + @OrderDir
EXEC(@Query)
SELECT FlagID,
CenterID,
Flag,
(SELECT COUNT(distinct lPF.ProjectID)
From tblLinkProjectFlag lPF Inner Join Projectowner Po
On Po.Projectid = lPF.Projectid Left Join Projectnote Pn
On Po.Projectid = Pn.Projectid
WHERE FlagID = tblFlag.FlagID
and (Pn.Projectnotedate Between '2003-05-06' And '2007-03-03'
Or lpf.projectid in
(select projectid
from project p
where P.Firstvisitdate Between '2003-05-06' And '2007-03-03') )) AS countProject
FROM tblFlag
WHERE CenterID = 94
ORDER BY Flag ASC
jag tog även bort distinct eftersom du bara får en post i din subselect.
265 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849