SQL Azure has added something called database scoped global temporary tables.
Azure SQL Database supports global temporary tables that are also stored in tempdb and scoped to the database level. This means that global temporary tables are shared for all users’ sessions within the same Azure SQL database. User sessions from other Azure SQL databases cannot access global temporary tables.
They way you add these is by using a double pound sign
They way you create a database scoped global temporary table is like this
CREATE TABLE ##test ( a int, b int);
You are probably thinking...wait a minute, how is this different from a global temporary table? It is pretty much the same but on SQL Azure, it is scoped to the database level, while on prem it is scoped to the instance level
I was listening to the latest SQL Server Radio podcast and the hosts were talking about why anyone would ever need a global temporary table. Why not use a real table instead
I can come up with one answer....
Let's take a look
First create a database and then add a user who has read and write permissions
CREATE DATABASE Test GO CREATE LOGIN DenisTest WITH PASSWORD = 'DenisTest', CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF; USE Test GO CREATE USER DenisTest FOR LOGIN DenisTest; GO ALTER ROLE [db_datareader] ADD MEMBER DenisTest GO ALTER ROLE [db_datawriter] ADD MEMBER DenisTest GO
Now, let say we want to run a query several times and store the results
USE Test GO SELECT name,type_desc,state_desc,size FROM sys.database_files WHERE name ='Test'
So I need a table to store the results right?Let's try creating one......
CREATE TABLE SomeTable (name sysname, type_desc nvarchar(120), state_desc nvarchar(120), size int)
Msg 262, Level 14, State 1, Line 8
CREATE TABLE permission denied in database 'Test'.
That is right, we don't have permissions
Now let's add a double pound sign in front of that table
CREATE TABLE ##SomeTable (name sysname, type_desc nvarchar(120), state_desc nvarchar(120), size int)
And this works
Now we can insert into the table we just created
INSERT ##SomeTable SELECT name,type_desc,state_desc,size FROM sys.database_files WHERE name ='Test'
Also, we can insert and select from other sessions.query windows as well
Of course if the server restarts, this table will be gone. However if you want to capture some query output and look at it, you don't have to wait for someone to give you ddl_admin permission, create the table for you or make you db_owner.
Now why everyone would need a temporary stored procedure...that is another story and I can't really think of a reason