Использование переменных среды в T-SQL

Как я могу прочитать значение переменной системной среды в сценарии T-SQL?

Это должно работать на SQL Server 2005.


person benPearce    schedule 13.05.2009    source источник


Ответы (6)


Это должно дать вам список (при условии, что вы разрешаете людям запускать xp_cmdshell)

exec master..xp_cmdshell 'набор'

Примечание: xp_cmdshell представляет собой угрозу безопасности ...

Вы также можете сделать это с помощью управляемой хранимой процедуры, расширенной хранимой процедуры или через компонент com.

person Sam Saffron    schedule 13.05.2009

Чтобы «прочитать значение системной переменной среды в сценарии T-SQL», вы можете настроить SQL Management Studio на использование «sqlcmd Mode».

Тогда вы можете использовать это так:

Print '$(TEMP)'

:r $(Temp)\Member.sql
go

Я не уверен, как это делается вне «SQL Management Studio», но это будет сложно выяснить.

person user197525    schedule 27.10.2009
comment
RE: Один из способов сделать это за пределами студии управления sql - использовать sqlcmd.exe (по умолчанию он работает в режиме sqlcmd) - person Jason Jarrett; 16.04.2010
comment
Имейте в виду, что SQLCMD / SSMS заменяет переменные среды от клиента - OP предполагает, что он хочет знать переменные среды сервера. - person piers7; 24.08.2011

xp_cmdshell обычно лучше избегать из соображений безопасности.

Лучше использовать сборку CLR. Вот хорошее введение в создание сборки CLR .

Вы можете использовать System.Environment.GetEnvironmentVariable () в C # - вы найдете дополнительную информацию о том, как это сделать здесь.

person Aaron Alton    schedule 13.05.2009
comment
Я согласен с xp_cmdshell, но поскольку он уже включен, я могу использовать его в этом случае - person benPearce; 13.05.2009
comment
недокументированный процесс xp_regread также, вероятно, может быть использован при чтении реестра - person SQLMenace; 14.05.2009

Спасибо за ответы. Они помогли мне найти рабочее решение, хотя это, наверное, не самый продвинутый метод:

declare @val varchar(50)
create table #tbl (h varchar(50))
insert into #tbl exec master..xp_cmdshell 'echo %computername%'
set @val = (select top 1 h from #tbl)
drop table #tbl

В частности, я пытался получить имя хоста, echo% computername% можно было заменить системной командой hostname. Но теперь это работает для любой переменной окружения.

person benPearce    schedule 13.05.2009
comment
Это возвращает что-то иное, чем select \ @ \ @ servername? - person Ron Savage; 27.10.2009

Эй, если вы хотите узнать имя сервера, просто позвоните SELECT @@SERVERNAME

person Rodrigo    schedule 10.09.2009

Чтобы определить конкретную переменную среды в T-SQL (MS SQL Server), вы можете сделать что-то вроде:

Предоставить разрешения безопасности

use [master]

execute sp_configure 'show advanced options', 1
reconfigure
go

execute sp_configure 'xp_cmdshell', 1
reconfigure
go

grant execute on xp_cmdshell to [DOMAIN\UserName]

grant control server to [DOMAIN\UserName]
go

Источник: https://stackoverflow.com/a/13605864/601990

Использовать переменные среды

-- name of the variable 
declare @variableName nvarchar(50) = N'ASPNETCORE_ENVIRONMENT'

-- declare variables to store the result 
declare @environment nvarchar(50)
declare @table table (value nvarchar(50))

-- get the environment variables by executing a command on the command shell
declare @command nvarchar(60) = N'echo %' + @variableName + N'%';
insert into @table exec master..xp_cmdshell @command;
set @environment = (select top 1 value from @table);

-- do something with the result 
if @environment = N'Development' OR @environment = N'Staging'
    begin
    select N'test code'
    end
else 
    begin
    select N'prod code'
    end

Также не забудьте перезапустить службу SQL Server при изменении переменных среды.

person MovGP0    schedule 10.09.2018