Проблемы с именованием T-SQL
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure базе данных SQL в Microsoft Fabric
При анализе кода T-SQL в проекте базы данных один или несколько предупреждений могут быть классифицированы как проблемы именования. Чтобы избежать следующих ситуаций, следует устранить проблемы с именованием:
- Имя, указанное для объекта, может конфликтовить с именем системного объекта.
- Указанное имя всегда должно быть заключено в escape-символы (в SQL Server, "[" и "]").
- Указанное имя может запутать других, которые пытаются прочитать и понять код.
- Код может прерваться, если он запускается с будущими выпусками SQL Server.
Как правило, можно отключить проблему именования, если другие приложения, которые нельзя изменить, зависят от текущего имени.
Указанные правила определяют следующие проблемы именования:
- SR0011: избегайте использования специальных символов в именах объектов
- SR0012: избегайте использования зарезервированных слов для имен типов
- SR0016: избегайте использования sp_ в качестве префикса для хранимых процедур
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