@@SERVERNAME: примеры (SQL)

Работа с функцией @@SERVERNAME в SQL Server
Раздел: Системные информационные функции, Системные
@@SERVERNAME: nvarchar(256)

Основные сведения о функции @@SERVERNAME

Функция @@SERVERNAME в Microsoft SQL Server относится к категории системных функций конфигурации. Она предназначена для возвращения имени локального сервера, с которым в данный момент работает экземпляр SQL Server. Это имя соответствует имени сервера, зарегистрированному в системе.

Функция не принимает никаких аргументов. Её синтаксис предельно прост: @@SERVERNAME.

Возвращаемым значением является строка типа nvarchar(256). Если экземпляр SQL Server был установлен с именем по умолчанию (имя компьютера), то функция вернет это имя. В случае, если сервер был переименован с помощью хранимой процедуры sp_addserver или sp_dropserver, функция возвратит актуальное сконфигурированное имя.

Основное применение функции — идентификация сервера в скриптах, логировании, многосерверных конфигурациях или при динамическом построении строк соединения, где логика зависит от конкретного экземпляра.

Простые примеры использования

Стандартный запрос для получения имени сервера:

SELECT @@SERVERNAME AS [Имя сервера];
Имя сервера
----------------------
DESKTOP-ABC123\SQLEXPRESS

Использование в строке с конкатенацией:

SELECT 'Текущий сервер: ' + @@SERVERNAME;
-----------------------------------
Текущий сервер: DESKTOP-ABC123\SQLEXPRESS

Применение в условии WHERE для фильтрации данных, специфичных для сервера (например, в таблице конфигураций):

SELECT ConfigValue
FROM ServerConfig
WHERE ServerName = @@SERVERNAME;

Альтернативные функции в MS SQL Server

В MS SQL Server существуют другие функции для получения информации о сервере, каждая со своей спецификой:

  • SERVERPROPERTY('ServerName'): Возвращает полное имя экземпляра, включая имя хоста и имя экземпляра. Часто совпадает с @@SERVERNAME, но считается более надежным источником, так как менее подвержен ручным изменениям конфигурации. Предпочтительнее для нового кода.
  • HOST_NAME(): Возвращает имя рабочей станции (хоста), с которой установлено соединение с SQL Server, а не имя сервера SQL Server.
  • @@SERVICENAME: Возвращает имя службы Windows, под которой запущен экземпляр SQL Server (например, 'MSSQLSERVER').

Для получения сетевого имени узла сервера (без имени экземпляра) часто используют комбинацию функций: SERVERPROPERTY('MachineName').

Аналоги в других СУБД и языках

MySQL: Используют системную переменную @@hostname. Она возвращает имя хоста сервера.

SELECT @@hostname;
mysql-server.local

Oracle: Имя экземпляра базы данных можно получить через представление V$INSTANCE или функцию SYS_CONTEXT.

SELECT SYS_CONTEXT('USERENV', 'SERVER_HOST') FROM dual;
oracle-host

PostgreSQL: Для получения имени хоста сервера используют функцию inet_server_addr() (возвращает IP) или current_setting('server_version') для версии, но прямого аналога нет. Часто имя берут из переменной окружения или конфигурации.

SELECT inet_server_addr();
192.168.1.100

SQLite: Не является клиент-серверной СУБД, поэтому аналогичной функции не существует.

Типичные ошибки и их причины

Основная ошибка — предположение, что @@SERVERNAME всегда возвращает сетевое имя компьютера. После переименования сервера на уровне ОС или в SQL Server (с помощью sp_dropserver/sp_addserver) значение может устареть и не соответствовать реальному имени хоста.

-- Если сервер не был корректно переименован,
-- функция может вернуть старое имя или даже NULL.
SELECT @@SERVERNAME AS OldName,
       SERVERPROPERTY('ServerName') AS ActualName;

Другая распространенная ошибка — путаница с функцией HOST_NAME(), которая возвращает имя клиентского компьютера, а не сервера.

-- На сервере:
SELECT @@SERVERNAME AS ServerName, HOST_NAME() AS ClientHostName;
-- Результат будет разным для подключений с разных клиентов.

История изменений функции

Функция @@SERVERNAME существует с ранних версий SQL Server и сохраняет свою базовую функциональность без существенных изменений. В последних версиях (SQL Server 2019, 2022) её поведение остается стабильным.

Основное внимание в последних версиях уделяется рекомендации использовать более надежную и информативную функцию SERVERPROPERTY(), которая предоставляет ширеий спектр свойств сервера.

Расширенные примеры применения

Использование в динамическом SQL для выполнения команд на определенном сервере в скрипте администрирования:

Пример sql
DECLARE @ServerName NVARCHAR(256) = @@SERVERNAME;
DECLARE @SqlCommand NVARCHAR(MAX);
IF @ServerName = 'PRODUCTION_SERVER'
BEGIN
    SET @SqlCommand = 'EXEC msdb.dbo.sp_start_job N''Critical Backup'';';
    EXEC sp_executesql @SqlCommand;
END;

Логирование имени сервера в пользовательской таблице аудита при выполнении триггера:

Пример sql
CREATE TRIGGER tr_AuditChanges
ON dbo.ImportantTable
AFTER UPDATE
AS
BEGIN
    INSERT INTO AuditLog (TableName, ChangeDate, ServerName, UserName)
    VALUES ('ImportantTable', GETDATE(), @@SERVERNAME, SUSER_NAME());
END;

Определение окружения (разработка, тестирование, производство) на основе имени сервера:

Пример sql
SELECT CASE
        WHEN @@SERVERNAME LIKE '%DEV%' THEN 'Разработка'
        WHEN @@SERVERNAME LIKE '%TEST%' THEN 'Тестирование'
        WHEN @@SERVERNAME LIKE '%PROD%' THEN 'Продакшен'
        ELSE 'Неизвестно'
       END AS Environment;

Сравнение имени сервера с именем из системного свойства для диагностики несоответствий:

Пример sql
SELECT @@SERVERNAME AS ConfiguredName,
       SERVERPROPERTY('ServerName') AS ReportedName,
       CASE WHEN @@SERVERNAME = SERVERPROPERTY('ServerName')
            THEN 'Совпадение'
            ELSE 'Несоответствие! Требуется sp_dropserver/sp_addserver'
       END AS Status;

MS SQL @@SERVERNAME function comments

En
@@SERVERNAME Returns the name of the local server that is running SQL Server