2011-01-24 7 views
0

J'ai créé une requête ci-dessous, mais je ne comprends pas pourquoi je reçois l'erreur:L'identifiant multipart ne pouvait pas être lié

The multi-part identifier "fi.FacetsImportId" could not be bound. (For each field)

INSERT INTO [Elig].[dbo].[ErrorTable] 
(
    [SeqId], 
    [CodeId], 
    [SubjectArea], 
    [FieldName], 
    [TableName], 
    [ErrorValue], 
    [ActiveFlag] 
) 
Select 
    [fi].[FacetsImportId] AS [SeqId], 
    @InvalidLength AS [CodeId], 
    @SubjectArea AS [SubjectArea], 
    FieldName, 
    'Facets.FacetsImport', 
    ErrorValue, 
    '@ActiveFlag' 
From (
    select [fi].[FacetsImportId] 
    ,Case When len([fi].[FacetsData]) > 200 Then [FacetsData] Else 'CorrectValue' end as [FacetsData] 
    ,Case When len([fi].[DataIndicator]) > 4 Then [DataIndicator] Else 'CorrectValue' end as [DataIndicator] 
    from Facets.FacetsImport) [fi] 
Unpivot (
    ErrorValue for FieldName in ([FacetsData], [DataIndicator])) as x 
where x.ErrorValue <> 'CorrectValue' 
+0

HI, oui c'est SQL Server 2005 – Programmer

Répondre

4

Votre subselect ne alias Facets.FacetsImport. Cela devrait fonctionner, notez que j'ai supprimé l'alias de la sous-sélection. Ne regardez pas comme il était nécessaire:

INSERT INTO [Elig].[dbo].[ErrorTable] ([SeqId], [CodeId], [SubjectArea], [FieldName], [TableName], [ErrorValue], [ActiveFlag]) 
Select [fi].[FacetsImportId] AS [SeqId], 
    @InvalidLength AS [CodeId], 
    @SubjectArea AS [SubjectArea], 
    FieldName, 
    'Facets.FacetsImport', 
    ErrorValue, 
    '@ActiveFlag' 
From ( 
    select [FacetsImportId], 
     Case When len([FacetsData]) > 200 Then [FacetsData] Else 'CorrectValue' end as [FacetsData], 
     Case When len([DataIndicator]) > 4 Then [DataIndicator] Else 'CorrectValue' end as [DataIndicator] 
    from Facets.FacetsImport 
) [fi] 
Unpivot (ErrorValue for [et].FieldName in ([FacetsData], [DataIndicator])) as x 
where x.ErrorValue <> 'CorrectValue' 
+0

Salut Chris, merci pour votre réponse. J'ai essayé cela avant mais il donne cette erreur: Le type de colonne "DataIndicator" entre en conflit avec le type d'autres colonnes spécifiées dans la liste UNPIVOT. – Programmer

+0

@Programmer: il me semble que l'indicateur de données est un type de données et que FacetsData est un type de données différent. Bien sûr, la vraie question que j'ai est de savoir d'où vient [et]. Est-ce votre entière question? – NotMe

+0

Salut, je l'ai pris. ce n'est pas dans la requête. c'était juste une erreur. FacetsData et DataIndicator ont tous deux un type de données varchar. – Programmer

0

Vous avez besoin d'alias [fi] à l'intérieur AND à l'extérieur du sous-requête. Modifier une ligne dans votre requête

from Facets.FacetsImport [fi]) [fi] 

Pour cela si FacetsData is Varchar(200) and DataIndicator is Varchar(4), changer 1 plus

,Case When len([fi].[DataIndicator]) > 4 Then convert(varchar(200), [DataIndicator]) Else 'CorrectValue' end as [DataIndicator] 

Mais qui pose la question, quand le test

len([fi].[DataIndicator]) > 4 

retour toujours vrai pour une colonne varchar (4) ??

+0

Salut @cyberkiwi, merci pour votre réponse. le champ DataIndicator peut avoir des enregistrements invalides et je dois capturer celui avec une longueur supérieure à 4. – Programmer

+0

Vous venez d'indiquer que c'est varchar (4). La longueur maximale ne peut être que de 4, alors comment cela peut-il arriver? – RichardTheKiwi

Questions connexes