Dela via


Problem med T-SQL-namngivning

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

När du analyserar T-SQL-koden i databasprojektet kan en eller flera varningar kategoriseras som namngivningsproblem. Du bör åtgärda namngivningsproblem för att undvika följande situationer:

  • Namnet som du angav för ett objekt kan vara i konflikt med namnet på ett systemobjekt.
  • Namnet som du angav måste alltid omges av escape-tecken (i SQL Server, [" och "]").
  • Namnet som du angav kan förvirra andra som försöker läsa och förstå din kod.
  • Koden kan brytas om du kör den med framtida versioner av SQL Server.

I allmänhet kan du förhindra ett namngivningsproblem om andra program som du inte kan ändra beror på det aktuella namnet.

De angivna reglerna identifierar följande namngivningsproblem:

SR0011: Undvik att använda specialtecken i objektnamn

Om du namnger ett databasobjekt med något tecken i följande tabell gör du det svårare att inte bara referera till objektet utan även att läsa kod som innehåller namnet på objektet:

Character Description
Whitespace character
[ Vänster hakparentes
] Höger hakparentes
' Enkelt citattecken
" Dubbelt citattecken

Så här åtgärdar du överträdelser

För att lösa det här problemet måste du ta bort alla specialtecken från objektnamnet. Om objektet refereras till på andra platser i databasprojektet (till exempel i databasenhetstester) bör du använda databasrefaktorisering för att uppdatera referenserna. Mer information finns i Byt namn på alla referenser till ett databasobjekt.

Example

I det första exemplet innehåller en tabell en kolumn som har ett specialtecken i sitt namn. I det andra exemplet innehåller namnet inte något specialtecken.

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: Undvik att använda reserverade ord för typnamn

Du bör undvika att använda ett reserverat ord som namnet på en användardefinierad typ eftersom läsarna har svårare att förstå din databaskod. Du kan endast använda reserverade ord i SQL Server som identifierare och objektnamn om du använder avgränsade identifierare. Mer information finns i den fullständiga listan över reserverade nyckelord.

Så här åtgärdar du överträdelser

Du måste byta namn på den användardefinierade typen eller objektnamnet.

Example

Det första exemplet visar definitionen för en användardefinierad typ som utlöser den här varningen. Det andra exemplet visar ett sätt att korrigera den användardefinierade typen och lösa problemet.

-- 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: Undvik att använda sp_ som prefix för lagrade procedurer

I SQL Server betecknar prefixet sp_ systemlagrade procedurer. Om du använder prefixet för dina lagrade procedurer kan namnet på proceduren stå i konflikt med namnet på en system lagrad procedur som kommer att skapas i framtiden. Om en sådan konflikt uppstår kan ditt program sluta fungera om det refererar till proceduren utan att kvalificera referensen efter schema. I den här situationen binder namnet till systemproceduren i stället för till din procedur.

Så här åtgärdar du överträdelser

För att lösa det här problemet måste du ersätta sp_ med ett annat prefix för att ange användar lagrade procedurer, eller så får du inte använda något prefix alls.

Example

I det första exemplet gör procedurnamnet att varningen utfärdas. I det andra exemplet använder proceduren ett usp_ prefix i stället för sp_ och undviker varningen.

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