Поделиться через


Проблемы с именованием T-SQL

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure базе данных SQL в Microsoft Fabric

При анализе кода T-SQL в проекте базы данных один или несколько предупреждений могут быть классифицированы как проблемы именования. Чтобы избежать следующих ситуаций, следует устранить проблемы с именованием:

  • Имя, указанное для объекта, может конфликтовить с именем системного объекта.
  • Указанное имя всегда должно быть заключено в escape-символы (в SQL Server, "[" и "]").
  • Указанное имя может запутать других, которые пытаются прочитать и понять код.
  • Код может прерваться, если он запускается с будущими выпусками SQL Server.

Как правило, можно отключить проблему именования, если другие приложения, которые нельзя изменить, зависят от текущего имени.

Указанные правила определяют следующие проблемы именования:

SR0011: избегайте использования специальных символов в именах объектов

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

Символ Description
Символ пробела
[ Левая квадратная скобка
] Правая квадратная скобка
' Одиночная кавычка
" Двойная кавычка

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

Чтобы устранить эту проблему, необходимо удалить все специальные символы из имени объекта. Если объект ссылается в других расположениях проекта базы данных (например, в модульных тестах базы данных), следует использовать рефакторинг базы данных для обновления ссылок. Дополнительные сведения см. в разделе "Переименование всех ссылок на объект базы данных".

Пример

В первом примере таблица содержит столбец с особым символом в его имени. Во втором примере имя не содержит специального символа.

CREATE TABLE [dbo].[TableWithProblemColumn]
(
[ID] INT NOT NULL IDENTITY(0, 1),
[Small'String] VARCHAR(10)
)
ON [PRIMARY]

CREATE TABLE [dbo].[FixedTable]
(
[ID] INT NOT NULL IDENTITY(0, 1),
[SmallString] VARCHAR(10)
)
ON [PRIMARY]

SR0012: избегайте использования зарезервированных слов для имен типов

Не следует использовать зарезервированное слово в качестве имени определяемого пользователем типа, так как читатели имеют более сложное представление о коде базы данных. Зарезервированные слова в SQL Server можно использовать в качестве идентификаторов и имен объектов, только если используются идентификаторы с разделителями. Дополнительные сведения см. в полном списке зарезервированных ключевых слов.

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

Необходимо переименовать определяемый пользователем тип или имя объекта.

Пример

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

-- Potential misuse of a keyword as a type name
CREATE TYPE Alter
FROM nvarchar(11) NOT NULL;

-- Corrected type name
CREATE TYPE AlterType
FROM nvarchar(11) NOT NULL;

SR0016: избегайте использования sp_ в качестве префикса для хранимых процедур

В SQL Server sp_ префикс назначает системные хранимые процедуры. Если вы используете этот префикс для хранимых процедур, имя процедуры может конфликтуть с именем системной хранимой процедуры, которая будет создана в будущем. Если такой конфликт возникает, приложение может нарушиться, если приложение ссылается на процедуру без указания ссылки по схеме. В этой ситуации имя привязывается к системной процедуре вместо процедуры.

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

Чтобы устранить эту проблему, необходимо заменить sp_ другим префиксом для назначения пользовательских хранимых процедур или не использовать префикс вообще.

Пример

В первом примере имя процедуры приводит к тому, что это предупреждение будет выдано. Во втором примере процедура использует usp_ префикс вместо sp_ предупреждения.

CREATE PROCEDURE [dbo].[sp_procWithWarning]
(
@Value1 INT,
)
AS
BEGIN
-- Additional statements here
RETURN 0;
END

CREATE PROCEDURE [dbo].[usp_procFixed]
(
@Value1 INT,
)
AS
BEGIN
-- Additional statements here
RETURN 0;
END