SR0010: не используйте устаревший синтаксис при объединении таблиц или представлений

Идентификатор RuleId

SR0010

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

Одно или несколько соединений между таблицами и представлениями используют устаревший синтаксис (такой как =, *= и =* в предложении WHERE) вместо текущего синтаксиса.

Описание правила

Соединения, использующие устаревший синтаксис, делятся на две категории:

  • Внутреннее соединение
    Для внутреннего соединения значения соединяемых столбцов сравниваются с помощью оператора сравнения, такого как "=", "<", ">=" и т.п. Внутренние соединения возвращают строки, только если хотя бы одна строка из каждой таблицы соответствует условиям соединения.

  • Внешнее соединение
    Внешние объединения возвращают все строки из по крайней мере одной таблицы или представления, указанных в предложении FROM, если они удовлетворяют условиям поиска WHERE или HAVING. При использовании *= и = * для указания внешнего соединения применяется устаревший синтаксис.

Устранение нарушений

Чтобы устранить нарушение во внутреннем соединении, используйте синтаксис INNER JOIN, как показано в примере ниже в этом же разделе. Дополнительные сведения см. на странице Использование внутренних соединений (страница может быть на английском языке) веб-сайта корпорации Майкрософт.

Чтобы устранить нарушение во внешнем соединении, используйте подходящий синтаксис OUTER JOIN, как показано в примерах ниже в этом же разделе. Имеются следующие варианты:

  • LEFT OUTER JOIN или LEFT JOIN

  • RIGHT OUTER JOIN или RIGHT JOIN

    Примечание

    Transact-SQL поддерживает FULL OUTER JOIN и FULL JOIN, но в этом типе соединения не было предыдущего синтаксиса.

Дополнительные сведения см. на странице Использование внешних соединений (страница может быть на английском языке) веб-сайта корпорации Майкрософт.

Отключение предупреждений

Не следует отключать данные предупреждения. Следует исправить все экземпляры, поскольку устаревший синтаксис может не работать в будущих выпусках SQL Server.

Пример

В этих шести примерах показаны следующие параметры.

  1. В примере 1 демонстрируется устаревший синтаксис для внутреннего соединения.

  2. В примере 2 показывается порядок обновления примера 1, чтобы в нем использовался текущий синтаксис.

  3. В примере 3 демонстрируется устаревший синтаксис для левого внешнего соединения.

  4. В примере 4 показывается порядок обновления примера 2, чтобы в нем использовался текущий синтаксис.

  5. В примере 5 демонстрируется устаревший синтаксис для правого внешнего соединения.

  6. В примере 6 показывается порядок обновления примера 5, чтобы в нем использовался текущий синтаксис.

-- Example 1: Deprecated syntax for an inner join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] T2, [dbo].[Table1] T1 
WHERE [T1].[ID] = [T2].[ID]

-- Example 2: Current syntax for an inner join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] AS T2
INNER JOIN [dbo].[Table1] as T1
ON [T2].[ID] = [T2].[ID]

-- Example 3: Deprecated syntax for a left outer join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] T2, [dbo].[Table1] T1 
WHERE [T1].[ID] *= [T2].[ID]

-- Example 4: Fixed syntax for a left outer join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] AS T2
LEFT OUTER JOIN [dbo].[Table1] as T1
ON [T2].[ID] = [T2].[ID]

-- Example 5: Deprecated syntax for a right outer join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] T2, [dbo].[Table1] T1 
WHERE [T1].[ID] =* [T2].[ID]

-- Example 6: Fixed syntax for a right outer join
SELECT [T2].[c3], [T1].[c3] 
FROM [dbo].[Table2] AS T2
RIGHT OUTER JOIN [dbo].[Table1] as T1
ON [T2].[ID] = [T2].[ID]

См. также

Основные понятия

Анализ кода базы данных с целью улучшения качества кода