@@SERVERNAME: примеры (SQL)
@@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 для выполнения команд на определенном сервере в скрипте администрирования:
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;Логирование имени сервера в пользовательской таблице аудита при выполнении триггера:
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;Определение окружения (разработка, тестирование, производство) на основе имени сервера:
SELECT CASE
WHEN @@SERVERNAME LIKE '%DEV%' THEN 'Разработка'
WHEN @@SERVERNAME LIKE '%TEST%' THEN 'Тестирование'
WHEN @@SERVERNAME LIKE '%PROD%' THEN 'Продакшен'
ELSE 'Неизвестно'
END AS Environment;Сравнение имени сервера с именем из системного свойства для диагностики несоответствий:
SELECT @@SERVERNAME AS ConfiguredName,
SERVERPROPERTY('ServerName') AS ReportedName,
CASE WHEN @@SERVERNAME = SERVERPROPERTY('ServerName')
THEN 'Совпадение'
ELSE 'Несоответствие! Требуется sp_dropserver/sp_addserver'
END AS Status;