Не ваша обычная ошибка «Не удалось связать идентификатор из нескольких частей» - PullRequest
2 голосов
/ 29 марта 2010

У меня следующий запрос, теперь странно то, что если я запускаю этот запрос на моем сервере разработки и pre-prod, он работает нормально. Если я запустил его на производстве, он потерпит неудачу.

Я выяснил, что если я выполняю только оператор Select, то он доволен, но как только я пытаюсь вставить переменную таблицы, он жалуется.

DECLARE @RESULTS TABLE
    (
     [Parent] VARCHAR(255)
    ,[client] VARCHAR(255)
    ,[ComponentName] VARCHAR(255)
    ,[DealName] VARCHAR(255)
    ,[Purchase Date] DATETIME
    ,[Start Date] DATETIME
    ,[End Date] DATETIME
    ,[Value] INT
    ,[Currency] VARCHAR(255)
    ,[Brand] VARCHAR(255)
    ,[Business Unit] VARCHAR(255)
    ,[Region] VARCHAR(255)
    ,[DealID] INT
    )

INSERT  INTO @RESULTS
SELECT DISTINCT
    ClientName 'Parent'
   ,F.ClientID 'client'
   ,ComponentName
   ,A.DealName
   ,CONVERT(SMALLDATETIME , ISNULL(PurchaseDate , '1900-01-01')) 'Purchase Date'
   ,CONVERT(SMALLDATETIME , ISNULL(StartDate , '1900-01-01')) 'Start Date'
   ,CONVERT(SMALLDATETIME , ISNULL(EndDate , '1900-01-01')) 'End Date'
   ,DealValue 'Value'
   ,D.Currency 'Currency'
   ,ShortBrand 'Brand'
   ,G.BU 'Business Unit'
   ,C.DMRegion 'Region'
   ,DealID
FROM
    LTCDB_admin_tbl_Deals A
    INNER JOIN dbo_DM_Brand B
    ON A.BrandID = B.ID
    INNER JOIN LTCDB_admin_tbl_DM_Region C
    ON A.Region = C.ID
    INNER JOIN LTCDB_admin_tbl_Currency D
    ON A.Currency = D.ID
    INNER JOIN LTCDB_admin_tbl_Deal_Clients E
    ON A.DealID = E.Deal_ID
    INNER JOIN LTCDB_admin_tbl_Clients F
    ON E.Client_ID = F.ClientID
    INNER JOIN LTCDB_admin_tbl_DM_BU G
    ON G.ID = A.BU
    INNER JOIN LTCDB_admin_tbl_Deal_Components H
    ON A.DealID = H.Deal_ID
    INNER JOIN LTCDB_admin_tbl_Components I
    ON I.ComponentID = H.Component_ID
WHERE
    EndDate != '1899-12-30T00:00:00.000'
    AND StartDate < EndDate
    AND B.ID IN ( 1 , 2 , 5 , 6 , 7 , 8 , 10 , 12 )
    AND C.SalesRegionID IN ( 1 , 3 , 4 , 11 , 16 )
    AND A.BU IN ( 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 11 , 12 , 15 , 16 , 19 , 20 , 22 , 23 , 24 , 26 , 28 , 30 )
    AND ClientID = 16128

SELECT ... FROM @Results

Я получаю следующую ошибку

Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "Tbl1021.ComponentName" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "Tbl1011.Currency" could not be bound.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2454'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2461'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2491'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2490'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2482'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2478'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2477'.
Msg 207, Level 16, State 1, Line 1
Invalid column name 'Col2475'.

РЕДАКТИРОВАТЬ - РЕДАКТИРОВАТЬ - РЕДАКТИРОВАТЬ - РЕДАКТИРОВАТЬ - РЕДАКТИРОВАТЬ - РЕДАКТИРОВАТЬ в процессе устранения я обнаружил, что следую, и задался вопросом, может ли кто-нибудь пролить свет на это.

  1. Если я удаляю только DISTINCT, запрос выполняется нормально, добавьте DISTINCT, и я получу странные ошибки.
  2. Также я обнаружил, что если я прокомментирую следующие строки, тогда запрос будет выполняться с DISTINCT, что странно, так как ни на один из столбцов таблицы LTCDB_admin_tbl_Deal_Components не дается ссылка, поэтому я не вижу, как это повлияет на отдельное. 1016 *
INNER JOIN LTCDB_admin_tbl_Deal_Components H 
ON A.DealID = H.Deal_ID

Ответы [ 3 ]

3 голосов
/ 29 марта 2010

Есть ли какие-либо из этих видов? Кажется, я помню, как получал странные ошибки после изменения определений представлений и не запуска sp_refreshview. Я нигде не вижу текст "Tbl1021", поэтому я предполагаю, что это, вероятно, будет в определении View?

Если это так, здесь есть скрипт для обновления всех представлений Как создать хранимую процедуру, которая вызывает sp_refreshview для каждого представления в базе данных?

1 голос
/ 30 марта 2010

Хорошо, я до сих пор не знаю, что вызвало это или какой правильный ответ, но вот что я в итоге сделал, чтобы исправить это.

  1. Я создал дубликат ошибочной таблицы и наполнил ее копией данных.
  2. Я создал все те же ключи, индексы и т. Д.
  3. Протестировал запрос и угадай, что он сработал.

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

Все запросы, которые раньше не выполнялись, теперь работают отлично. Очень странно

0 голосов
/ 29 марта 2010

Евгений Без запуска кода в моей системе разработки первое, что я хотел бы решить, - это непоследовательное использование псевдонима в коде. Вы должны, насколько это возможно, всегда практиковать кодирование, чтобы идентифицировать объект. I.E, используя в этом примере префикс каждого объекта с соответствующим псевдонимом A, B, C и т. Д.

I.E например, ClientName 'Parent' делает это A.ClientName 'Parent' если этот столбец был в таблице с псевдонимом A

SELECT DISTINCT 
    ClientName 'Parent' 
   ,F.ClientID 'client' 
   ,ComponentName 
   ,A.DealName 
   ,CONVERT(SMALLDATETIME , ISNULL(PurchaseDate , '1900-01-01')) 'Purchase Date' 
   ,CONVERT(SMALLDATETIME , ISNULL(StartDate , '1900-01-01')) 'Start Date' 
   ,CONVERT(SMALLDATETIME , ISNULL(EndDate , '1900-01-01')) 'End Date' 
   ,DealValue 'Value' 
   ,D.Currency 'Currency' 
   ,ShortBrand 'Brand' 
   ,G.BU 'Business Unit' 
   ,C.DMRegion 'Region' 
   ,DealID 
FROM 
    LTCDB_admin_tbl_Deals A 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...