Як звернутися до глобальної тимчасової таблиці з іншого сеансу stack overflow російською

Глобальні тимчасові таблиці видно у всіх сенсах. Глобальні тимчасові таблиці автоматично видаляються при завершенні сеансу. який створив таблицю, і припинення звернення до них всіх інших завдань. Яким чином можна скористатися глобальної тимчасової таблицею з іншого сеансу? Наприклад, в одній збереженій процедурі створилася глобальна тимчасова таблиця і помістилися дані в цю таблицю, а з інших процедур йде звернення до глобальної тимчасової таблиці

Звертаємося до глобальної тимчасової таблиці з іншої процедури:

Чи можливо це взагалі? Якщо немає, то чи є якісь інші рішення? Або, може бути, можливо зробити так, щоб таблиця не видалявся при завершенні сеансу?

заданий 9 Березня '16 о 14:37

Глобальні тимчасові таблиці автоматично видаляються при завершенні сеансу, який створив таблицю, і припинення звернення до них всіх інших завдань.

Все вірно. Якщо ## таблиця створюється в одній сесії, і доступ до неї здійснюється з інших сесій, то в них вона доступна, поки перша сесія не закрилася або до ## таблиці є звернення з цих інших сесій. Причому важливо, чи є звернення саме в даний момент часу, а чи не будуть вони коли-небудь потім.

Як це діє можна бачити на наступному прикладі. Створимо одночасно дві сесії.

і залишимо цю сесію поки відкритою.

Отримаємо дані, якими ми заповнили таблицю в Сесії 1, як і годиться. Тепер в Сесії 2 виконаємо:

це викличе блокування ## t (той самий "є звернення").

Сесію 1 тепер закриємо, а в Сесії 2 виконаємо:

Хоча Сесія 1, в якій була створена ## таблиця вже закрита, перша вибірка пройде успішно, тому що ## t була нами захоплена в Сесії 2. Після завершення транзакції (COMMIT) в Сесії 2 відбудеться звільнення ## t. а тому її сесія-ініціатор вже закрита, то ## t тут же буде видалена. Відповідно, друга вибірка завершиться вже з помилкою.

Яким чином можна скористатися глобальної тимчасової таблицею з іншого сеансу?

Так як ви і робите це, але, як видно з прикладу вище, є деякі нюанси, що стосуються життєвого циклу ## таблиць.

Залежно від ситуації, можливі наступні варіанти:

  • Утримувати сесію, що створила ## таблицю, відкритої на час доступу до неї з інших сесій. Це, напевно, найбільш простий і найменш проблемний варіант, якщо, звичайно, архітектура програми дозволяє його використовувати.
  • Можна створити ## таблицю в одній сесії, потім в інший сесії провести її захоплення, встановивши прийнятну блокування, після чого сесія, яка створила ## таблицю, може бути закрита.
  • У деяких випадках логіка програми може дозволяти робити перевірку існування / створення / заповнення ## таблиці в кожній сесії, де це необхідно. В цьому випадку ініціює код можна винести в окрему процедуру і виконувати по-необхідності в кожній такій сесії.
  • Якщо перераховані вище варіанти не підходять, то це може бути знаком того, що за допомогою ## таблиць ви намагаєтеся вирішити задачу, яку насправді слід вирішувати, використовуючи постійні таблиці.
  • Існує також деяка альтернатива між ## і постійними таблицями - це створення постійних таблиць в tempdb (вони будуть існувати до наступного рестарту SqlServer). Однак особисто мені такий спосіб здається "брудним".

відповідь дан 10 Березня '16 о 7:30

Схожі статті