2017-02-09 4 views
-3

Так, видимо, это имеет неоднозначных имя столбца «LocationID»:Неоднозначное название столбца ... но только иногда?

DECLARE @temptable table (LocationID int) 
INSERT INTO @temptable SELECT LocationID FROM inserted; 

INSERT INTO dbo.LocationsPlants (LocationID, PlantID) 
(SELECT LocationID, PlantID FROM dbo.Plants CROSS JOIN @temptable) 

Что я могу исправить, изменив нижнюю строку:

(SELECT T.LocationID, PlantID FROM dbo.Plants CROSS JOIN @temptable AS T) 

Но это идентичный запрос на другом столе делает НЕ имеют двусмысленную колонку Инкотермс ID:

DECLARE @temptable table (IncotermsID int) 
INSERT INTO @temptable SELECT IncotermsID FROM inserted; 

INSERT INTO dbo.IncotermsPlants (IncotermsID, PlantID) 
(SELECT IncotermsID,PlantID FROM dbo.Plants CROSS JOIN @temptable) 

Я озадачен. Таблица структуры:

dbo.Locations:

[LocationID] [int] NOT NULL, 
    [LocationTypeID] [int] NOT NULL, 
    [Title] [varchar](100) NULL 

dbo.Incoterms:

[IncotermsID] [int] IDENTITY(1,1) NOT NULL, 
    [Incoterm] [varchar](20) NOT NULL 
+4

Всегда используйте псевдонимы таблиц и квалифицированные имена столбцов, особенно если в запросе содержится более одной таблицы. Тогда вам никогда не придется беспокоиться об этой ошибке. –

+1

И определение для растений? –

+0

Бинго, я забыл, что у меня было LocationID в растениях. НЕОБХОДИМОСТЬ. БОЛЬШЕ. КОФЕ. – Eliska

ответ

1

Проблема, скорее всего, столбец с именем LocationID в Plants таблице, поэтому запрос запутался относительно которого LocationID колонка, которую необходимо вернуть, от Plants или от @temptable?

Как упомянуто @GordonLinoff, это хорошая практика (я бы сказал, что лучше всего) всегда использовать псевдонимы для ваших таблиц, используемых в соединениях или коррелированных запросах, и делать это для своих связанных столбцов.

Причина этого только происходит «иногда», потому что в вашем втором запросе, есть один IncotermsID существует только в одной таблице из двух используемых в вашем CROSS APPLY.

Смежные вопросы