Как сохранить переменную в SQL для использования в Go

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для сохранения значения переменной между вызовами GO в SQL Server рекомендуется использовать временные таблицы. Обратите внимание на пример ниже:

SQL
Скопировать код
-- Создаем временную таблицу для сохранения значения переменной
CREATE TABLE #TempVar(Value INT);

-- Добавляем значение к временной таблице
INSERT INTO #TempVar VALUES (42);  -- Ссылка на "Путеводитель по Галактике"

GO

-- Извлекаем значение из временной таблицы
SELECT @PersistedVar = Value FROM #TempVar;
PRINT @PersistedVar;  -- Выводит "42", универсальный ответ

-- Удаляем временную таблицу после использования
DROP TABLE #TempVar;

Этот метод позволяет переменным оставаться доступными даже после команды GO, таким образом обходя ограничение видимости переменных @variable.

Кинга Идем в IT: пошаговый план для смены профессии

Разбор взаимодействий за пределами "GO"

Избавление от избыточных команд "GO"

Прежде чем искать альтернативные решения, целесообразно повторно просмотреть ваш скрипт и удалить ненужные команды GO. Нередко реорганизация структуры кода способна предотвратить утрату видимости переменной.

Взаимодействие переменных и хранимых процедур – проверенные союзники

Передавайте значения переменных в качестве параметров в хранимые процедуры или пользовательские функции. Это позволяет им оставаться доступными после GO.

SQL
Скопировать код
-- Передача значения переменной в хранимую процедуру
EXEC MyStoredProcedure @MyParameter = @PersistedVar;

SQLCMD и предопределенные переменные

В режиме SQLCMD мы имеем возможность определения переменных через :setvar, которые в дальнейшем доступны через $(ИМЯ_ПЕРЕМЕННОЙ), что позволяет обойти ограничение GO.

SQL
Скопировать код
:setvar MyVariable 42
GO
PRINT '$(MyVariable)'  -- выводит "42", замкнутый круг?

Однако использовать USE @variable для переключения баз данных не получится, в этих ситуациях необходимо указывать название базы данных явным образом.

Визуализация

Представьте, что эстафета – это каждое исполнение команды GO. Задача участников — сохранить передаваемый объект (переменную) intact.

Markdown
Скопировать код
Бегун 1 🏃‍♂️: Нёс эстафету (переменную) 🎖️
После GO: 🏁
Бегун 2 🏃‍♀️: ???                          // Почему пусто? Где эстафета?

Ящик для эстафеты, в нашем случае таблица, служит укрытием, в котором первый бегун оставляет предмет, а второй его подбирает.

SQL
Скопировать код
-- Создаем таблицу для передачи эстафеты
CREATE TABLE VariableHandoff (Value SQL_VARIANT);

-- Первый участник оставляет переменную в таблице
INSERT INTO VariableHandoff VALUES (@MyVariable);

-- Второй участник подбирает переменную из таблицы
SELECT @MyVariable = Value FROM VariableHandoff;
Markdown
Скопировать код
Ящик для эстафеты 🎁: Сохраняет содержимое между командами GO.

Надежность: Обеспечивается за счет ящика для эстафеты, который стабильно хранит значение переменной между командами GO.

Особенности и рекомендации по работе с SQL

В SQL Server команда GO выступает в роли терминатора пакета, что обозначает, что переменные в SQL Server видимы лишь в пределах одного пакета инструкций. Иногда возникает необходимость, чтобы переменные оставались доступными между пакетами.

Способы обхода ограничений синтаксиса

Использовать USE @bob непосредственно невозможно, но можно воспользоваться динамическим SQL:

SQL
Скопировать код
DECLARE @DatabaseName NVARCHAR(128) = N'SampleDB';
DECLARE @DynamicSQL NVARCHAR(MAX) = N'USE ' + QUOTENAME(@DatabaseName) + '; SELECT 1 as TestData;';

-- Выполняем сформированный SQL-запрос
EXEC sp_executesql @DynamicSQL;

Будьте внимательны при работе с динамическим SQL, учтите вопросы безопасности и используйте лучшие практики.

Полезные материалы

  1. sp_set_session_context (Transact-SQL) – SQL Server | Microsoft Learnофициальная документация Microsoft по сохранению контекста сессии.
  2. Returning Promises from Vuex actions – Stack Overflowдискуссия на форуме Stack Overflow о поддержании состояния переменных при выполнении асинхронных операций во Vue.js.
  3. Working with Temporal Tables in SQL Server – SQLShackруководство по работе с временными таблицами для сохранения значений переменных.
  4. SQL Server Message 137: Must declare the scalar variable – SQL Authority — обзор проблем, связанных с декларированием переменных в SQL Server, и их решений.