Как объявить глобальную переменную в SQL Server..?
Я хочу использовать одно и то же значение для разных запросов из разных БД
как
DECLARE @GLOBAL_VAR_1 INT = Value_1
DECLARE @GLOBAL_VAR_2 INT = Value_2
USE "DB_1"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1
AND "COL_2" = @GLOBAL_VAR_2
USE "DB_2"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2
но его ошибка.
Должен объявить скалярную переменную "@GLOBAL_VAR_2".
Может ли кто-нибудь предложить любой способ сделать это??
Ответы
Ответ 1
Невозможно объявить глобальную переменную в Transact-SQL. Однако, если все, что вы хотите, чтобы ваши переменные были доступны через партии одного script, вы можете использовать инструмент SQLCMD или режим SQLCMD SSMS и определить такие переменные инструмента/режима, как это:
:setvar myvar 10
а затем используйте их следующим образом:
$(myvar)
Чтобы использовать режим SSMS SQLCMD:
![enter image description here]()
Ответ 2
Вы не можете объявлять глобальные переменные в SQLServer.
Если вы используете Management Studio, вы можете использовать режим SQLCMD, например, указав @Lanorkin.
В противном случае вы можете использовать CONTEXT_INFO
для хранения единственной переменной, которая видна во время сеанса и соединения, но после этого она исчезнет.
Только по-настоящему глобальным будет создание глобальной таблицы temp (с именем ## yourTableName) и сохранение ваших переменных там, но это также исчезнет, когда все соединение будет закрыто.
Ответ 3
Вы можете попробовать глобальную таблицу:
create table ##global_var
(var1 int
,var2 int)
USE "DB_1"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = (select var1 from ##global_var)
AND "COL_2" = @GLOBAL_VAR_2
USE "DB_2"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = (select var2 from ##global_var)
Ответ 4
В этом конкретном примере ошибка из-за GO после использования операторов. Операторы GO сбрасывают среду, поэтому нет переменных пользователя. Их нужно снова объявить.
И ответом на вопрос глобальных переменных является "Нет", не существует глобальных переменных, по меньшей мере, для версий сервера Sql, равных или до 2008 года. Я не могу гарантировать то же самое для более новых версий SQL-сервера.
С уважением,
HINI
Ответ 5
Начиная с SQL Server 2016
новый способ обмена информацией в сеансе вводится через SESSION_CONTEXT и sp_set_session_context.
Вы можете использовать их как альтернативу CONTEXT_INFO()
, которые сохраняют только двоичное значение, ограниченное 128 байтами. Кроме того, пользователь может переписать значение в любое время и не очень хорошо использовать его для проверок безопасности.
Следующие проблемы разрешаются с использованием новых utils. Вы можете сохранить данные в более удобном для пользователя формате:
EXEC sp_set_session_context 'language', 'English';
SELECT SESSION_CONTEXT(N'language');
Кроме того, мы можем отметить его как read-only
:
EXEC sp_set_session_context 'user_id', 4, @read_only = 1;
Если вы попытаетесь изменить контекст сеанса read-only
, вы получите что-то вроде этого:
Msg 15664, уровень 16, состояние 1, процедура sp_set_session_context, строка 10 Невозможно установить ключ 'user_id' в контексте сеанса. Ключ был установлен как read_only для этого сеанса.
Ответ 6
Попробуйте использовать ;
вместо GO
. Он работал у меня в версии 2008 R2
DECLARE @GLOBAL_VAR_1 INT = Value_1;
DECLARE @GLOBAL_VAR_2 INT = Value_2;
USE "DB_1";
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1
AND "COL_2" = @GLOBAL_VAR_2;
USE "DB_2";
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2;
Ответ 7
Вы можете получить аналогичный результат, создав скалярнозначные функции, возвращающие значения переменных. Конечно, вызовы функций могут быть дорогими, если вы используете их в запросах, которые возвращают большое количество результатов, но если вы ограничиваете набор результатов, вы должны быть в порядке. Здесь я использую базу данных, созданную только для хранения этих полустатических значений, но вы также можете создавать их для каждой базы данных. Как вы можете видеть, нет входных переменных, а только хорошо названной функции, которая возвращает статическое значение: если вы измените это значение в функции, оно мгновенно изменится в любом месте, которое оно использовало (в следующий раз он вызвал).
USE [globalDatabase]
GO
CREATE FUNCTION dbo.global_GetStandardFonts ()
RETURNS NVARCHAR(255)
AS
BEGIN
RETURN 'font-family:"Calibri Light","sans-serif";'
END
GO
-- Usage:
SELECT '<html><head><style>body{' + globalDatabase.dbo.global_GetStandardFonts() + '}</style></head><body>...'
-- Result: <html><head><style>body{font-family:"Calibri Light","sans-serif";}</style></head><body>...
Ответ 8
declare @ID_var int
set @ID_var = 123456
select * from table where ID_var = @ID_var
или
declare @ID_var varchar(30)
set @ID_var = 123456
select * from table where ID_var = @ID_var
Ответ 9
Невозможно объявить глобальные переменные в SQL Server. Сервер Sql имеет концепцию глобальных переменных, но они определены системой и не могут быть расширены.
очевидно, что вы можете делать всевозможные трюки с SQL, который вы отправляете, - например, SqlCOmmand имеет такой механизм замены переменных - ПЕРЕД отправкой на SqlServer, но это о нем.
Ответ 10
Мой первый вопрос: какую версию SQL Server вы используете (например, 2005, 2008, 2008 R2, 2012)?
Предполагая, что вы используете 2008 или более поздние версии, SQL использует область для определения переменных. Я считаю, что в 2005 году все еще были глобальные переменные, которые использовали бы @@variablename вместо имени @variable, которое определяло бы разницу между глобальными и локальными переменными. Начиная с 2008 года, я считаю, что это было изменено на определенную структуру назначения переменных. Например, чтобы создать глобальную переменную, @variable должен быть определен в начале процедуры, функции, представления и т.д. В 2008 году и позднее @@определены системные переменные для системных функций, которые я действительно верю. Я мог бы объяснить, если вы объяснили версию, а также, где определена переменная, и ошибка, которую вы получаете.