Почему SQL Server не позволяет мне это сделать? Это дает мне 3
Идентификатор, состоящий из нескольких частей... не удалось привязать.
ошибки, потому что я использую фактическое имя таблицы, а не псевдоним таблицы, для ссылки на столбцы (это упрощенный пример).
SELECT TS_USERS.ts_id, ts_Users.ts_name
FROM ts_Users u
WHERE ts_users.ts_id > 0;
конечно это работает
SELECT u.ts_id, u.ts_name
FROM ts_Users u
WHERE u.ts_id > 0;
Это похоже на то, что SQL Server забывает фактическое имя таблицы, когда этой таблице присвоен псевдоним (в контексте SELECT)?
@david: Как уже отмечалось, это сильно упрощенный пример, в котором SQL для оператора SELECT создается несколькими функциями и склеивается вместе. Функции, генерирующие части SELECT, не имеют доступа к другим функциям, которые создают предложение FROM и устанавливают псевдонимы. Я не могу найти, где это поведение описано в документации SQL Server.
Я приведу вам реальный сценарий из жизни, где это произошло: в течение многих лет в офисе я не отвечал кому-то, кто озвучивал «Тома», потому что в одной комнате было три Т(х)ома; это сбивало с толку всех нас. Таким образом, у нас были ТА (это я!), TQ и TT; если кто-то говорил «Т(х)ом», никто из нас не реагировал, так как нам уже давно надоело поворачиваться к чему-то, не имеющему к нам отношения. Если кто-то говорил «ТА», он привлекал мое пристальное внимание. Вы делаете то же самое со своим столом; вы дали ему псевдоним и сказали ему отреагировать на это. Я не «забыл», что меня зовут Том, хотя и не ответил на него.
Не забывайте также, что вы можете ссылаться на таблицу несколько раз в одном операторе. Если бы у вас был SELECT * FROM dbo.users U JOIN dbo.users M ON U.ManagerID = M.UserID WHERE users.Name = N'Dave';
, на какую таблицу вы ссылаетесь в WHERE
?
@mnemotronic: «Я не могу найти, где это поведение описано в документации SQL Server». - Если это настоящий вопрос, то вполне возможно, что это не задокументировано явно, и поведение подразумевается на основе того, что в противном случае задокументировано, что псевдоним таблицы создает новый пользовательский идентификатор для этой таблицы в области этого запроса. Поведение наблюдается и подтверждается вашим собственным тестированием, поэтому не имеет большого значения, описывает ли какая-либо документация его четко так, как вы ожидаете.
Похоже, вам просто нужно переделать свою систему, генерирующую sql, или также использовать имя таблицы в качестве псевдонима.
Такое поведение определяется ANSI SQL.
@ThomA: Итак, в вашем примере, если кто-то войдет и скажет: «Мне нужно поговорить с ТА», тогда все поймут, что это имел в виду вас. Я понимаю, что использование псевдонима совпадает с именем таблицы. Теперь предположим, что кто-то вошел и сказал (представьте, что имя ниже — ваше полное имя...) «Мне нужно поговорить с Томасом Полом Андерсом», тогда вы бы: (А) Ответили, потому что это было ваше имя, и оно было полным и недвусмысленным, или (Б) Игнорировать человека, потому что он не использовал ваши инициалы? Мой пример похож на (A), за исключением того, что я не использовал [имя_сервера].[dbo].[имя_таблицы]. Это дает мне возможность исследовать.
Используя псевдоним [например, u
], вы сообщаете SQL, что в контексте этого запроса отныне ссылаться на таблицу можно только как u
и только u
.
Если у вас есть способ отключить псевдоним при создании этой команды, попробуйте это. Или попробуйте сделать псевдоним таким же, как имя таблицы.
Дело не в том, что он забывает имя таблицы, а в том, что код явно указывает ему использовать определенный идентификатор для этой таблицы. Если псевдоним не предназначен для использования, не указывайте его.