Как объявить глобальную переменную в 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 году и позднее @@определены системные переменные для системных функций, которые я действительно верю. Я мог бы объяснить, если вы объяснили версию, а также, где определена переменная, и ошибка, которую вы получаете.