Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Въведение във временните таблици в SQL Server

Временна таблица в SQL Server, както подсказва името, е таблица на база данни, която съществува временно на сървъра на база данни. Временна таблица съхранява подмножество от данни от нормална таблица за определен период от време.

Временните таблици са особено полезни, когато имате голям брой записи в таблица и многократно трябва да взаимодействате с малко подмножество от тези записи. В такива случаи вместо да филтрирате данните отново и отново, за да извлечете подмножеството, можете да филтрирате данните веднъж и да ги съхранявате във временна таблица. След това можете да изпълните своите заявки на тази временна таблица. Временните таблици се съхраняват в „tempdb“, което е системна база данни. Нека да разгледаме как можете да използвате временни данни в прост сценарий.

Подготовка на данните

Нека първо подготвим някои фиктивни данни. Ще използваме тези данни за създаване на временни таблици.

Изпълнете следния скрипт на вашия сървър на база данни.

CREATE DATABASE schooldb

CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    total_score INT NOT NULL,
    
 )


INSERT INTO student 

VALUES (1, 'Jolly', 'Female', 20, 500), 
(2, 'Jon', 'Male', 22, 545), 
(3, 'Sara', 'Female', 25, 600), 
(4, 'Laura', 'Female', 18, 400), 
(5, 'Alan', 'Male', 20, 500), 
(6, 'Kate', 'Female', 22, 500), 
(7, 'Joseph', 'Male', 18, 643), 
(8, 'Mice', 'Male', 23, 543), 
(9, 'Wise', 'Male', 21, 499), 
(10, 'Elis', 'Female', 27, 400);

Горният SQL скрипт създава база данни „schooldb“. В тази база данни се създава таблица, наречена „студент“ и някои фиктивни данни се добавят в таблицата.

Създаване на временна таблица

Има два метода за създаване на временни таблици.

Метод 1

Най-простият начин за създаване на временна таблица е чрез използване на израз INTO в SELECT заявка. Нека създадем временна таблица, която съдържа името, възрастта и пола на всички записи за мъже от студентската таблица.

USE schooldb;

SELECT name, age, gender
INTO #MaleStudents
FROM student
WHERE gender = 'Male'

Разгледайте горната заявка. Тук създадохме временна таблица „#MaleStudents“, която съхранява името, възрастта и пола на всички записи на ученици от мъжки пол от таблицата на учениците. За да дефинираме временна таблица, ние използваме оператора INTO след оператора SELECT. Името на временна таблица трябва да започва с хеш (#).

Сега, за да видите къде съществува тази таблица; отидете на “Object Explorer -> Бази данни -> Системни бази данни-> tempdb -> Временни таблици”. Ще видите името на вашата временна таблица заедно с идентификатора. Разгледайте следната фигура:

Сигурно се чудите за „000000000006“ в края на името на таблицата. Това е уникален идентификатор. Множество връзки към база данни могат да създават временни таблици с едно и също име, следователно, за да се разграничат временните таблици, създадени от различни връзки, сървърът на базата данни автоматично добавя този уникален идентификатор в края.

Можете да извършвате операции с временната таблица чрез същата връзка, която я е създала. Следователно, в същия прозорец за заявка, който създаде таблицата „#MaleStudents“, изпълнете следната заявка.

SELECT * FROM #MaleStudents

Тъй като таблицата #MaleStudents съдържа името, възрастта и пола на всички ученици от мъжки пол. Горната заявка ще изведе следните резултати.

[table id=15 /]

За да създадете нова връзка, можете просто да отворите нов прозорец за заявка в “SQL Server Management Studio”. Сега оставете предишната връзка отворена и създайте друга таблица „MaleStudents“, като използвате метод 2 в нов прозорец за заявка (нова връзка).

Метод 2

Вторият метод е подобен на създаването на нормални таблици. Разгледайте следното запитване. Тук отново ще създадем временна таблица #MaleStudents. Не забравяйте, че тази заявка трябва да бъде изпълнена от нова връзка.

USE schooldb;

CREATE TABLE #MaleStudents
(
	name VARCHAR(50),
	age int,
	gender VARCHAR (50)

)

INSERT INTO #MaleStudents
SELECT name, age, gender
FROM student
WHERE gender = 'Male'

Сега, ако изпълните горната заявка, трябва да видите две временни таблици #MaleStudents с различни уникални идентификатори вътре в tempdb. Това е така, защото тези две таблици са създадени от две различни връзки. Разгледайте следната екранна снимка.

Глобални временни таблици

Тук е уместно да се спомене, че временна таблица е достъпна само за връзката, създала тази временна таблица. Не е достъпен за други връзки. Въпреки това можем да създадем временни таблици, които са достъпни за всички отворени връзки. Такива временни таблици се наричат ​​глобални временни таблици. Името на глобалната временна таблица започва с двоен хеш символ (##). Нека създадем глобална временна таблица, която съдържа записи на всички студентки от студентската маса.

USE schooldb;

SELECT name, age, gender
INTO ##FemaleStudents
FROM student
WHERE gender = 'Female'

Сега можете да получите достъп до таблицата ##FemaleStudents от всяка от отворените връзки.

Изтриване на временна таблица

Има два начина за изтриване на временни таблици в SQL Server:автоматично изтриване и ръчно изтриване.

Автоматично изтриване

Временна таблица се изтрива автоматично, когато връзката, създала таблицата, бъде затворена. Като алтернатива, когато затворите прозореца на заявката, който създаде временната таблица, без да запазите промените, таблицата ще бъде затворена. Ако връзка изпълнява някои заявки към глобалната таблица, тогава тези заявки трябва да бъдат завършени първо, преди глобалната таблица да бъде изтрита.

Ръчно изтриване на таблица

Можете ръчно да изтриете таблица, без да затваряте връзка, като използвате оператора DROP TABLE. Не забравяйте обаче, че операторът трябва да бъде изпълнен от връзката, която всъщност е създала таблицата. Разгледайте следната заявка:

DROP TABLE #MaleStudents

Това е подобно на изтриване на нормална таблица.

Временни таблици и съхранени процедури

По-рано научихме, че временна таблица може да бъде достъпна само локално в връзката, която я е създала. Има едно изключение от това правило. Когато създавате съхранени процедури, можете да получите достъп до временни таблици и в други връзки.

Нека създадем две съхранени процедури, използвайки две различни връзки. Първата съхранена процедура ще вмъкне данни в таблицата #MaleStudents, докато втората ще избере данните от таблицата.

Създайте нова връзка. Ако използвате SQL Server Management Studio, можете да го направите, като отворите нов прозорец за заявка. Изпълнете следния SQL скрипт в новия прозорец на заявка.

Create Procedure spInsertStudent
    (@Name Varchar(50), @Age int,  @Gender Varchar(50))
As
Begin
    Insert Into #MaleStudents
    Values (@Name, @Age, @Gender)
End

Вече създадохме съхранена процедура, която вмъква запис във временната таблица #MaleStudent. Забележете, че тази връзка не е създала #MaleStudent, но ние осъществяваме достъп до него, като вмъкваме запис в него. Това е така, защото когато създавате съхранена процедура, можете да получите достъп до временни таблици от връзка, различна от тази, която е създала таблицата. Ако изпълните горната заявка, ще видите, че SQL Server няма да изведе грешка.

По същия начин отворете нова връзка и създайте следната съхранена процедура в нея:

CREATE PROCEDURE spListStudent
AS
BEGIN

	SELECT * FROM #MaleStudents
	ORDER BY name
END

Горната съхранена процедура избира всички записи от временната таблица #MaleStudents. Тук отново имаме достъп до временна таблица във връзка, която не е създала таблицата.

Сега тук е трудната част. Въпреки че можете да получите достъп до временна таблица в друга връзка, когато създавате съхранена процедура, не можете да получите достъп до временна таблица, когато „изпълните“ съхранена процедура в друга връзка. За да изпълните съхранена процедура, която осъществява достъп до временна таблица, трябва да сте вътре във връзката, създала временната таблица.

Затова изпълнете следните заявки във връзката, която създаде таблицата #MaleStudents.

EXECUTE spInsertStudent Bradley, 45, Male
Execute spListStudent

Тук първата съхранена процедура вмъква нов запис на ученик с името:Брадли, възраст:45 и пол:Мъж в таблицата #MaleStudents. Втората съхранена процедура избира всички записи от таблицата #MaleStudents във възходящ ред на името. Резултатът от горните съхранени процедури ще бъде:

[table id=16 /]

Можете ясно да видите нашия нововмъкнат запис в избраните записи по-горе.

Вижте също:

Производителност на табличните променливи в SQL Server

Представяне на общи изрази за таблица в SQL Server


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONVERT() в SQL Server

  2. Вземете основните колони на изглед въз основа на неговия набор от резултати

  3. SQL Server 2016 – Въведение в Stretch база данни

  4. Статистика за входа на файл за производителност на SQL Server

  5. Ограничения на SQL Server Express