Banco de pruebas simple:
USE tempdb;
GO
/*
This DROP TABLE should not be necessary, since the DROP SCHEMA
should drop the table if it is contained within the schema, as
I'd expect it to be.
*/
IF COALESCE(OBJECT_ID('tempdb..#MyTempTable'), 0) <> 0
DROP TABLE #MyTempTable;
IF EXISTS (SELECT 1 FROM sys.schemas s WHERE s.name = 'SomeSchema')
DROP SCHEMA SomeSchema;
GO
CREATE SCHEMA SomeSchema AUTHORIZATION [dbo]
CREATE TABLE SomeSchema.#MyTempTable /* specifying the schema
should not be necesssary since
this statement is executed inside
the context of the CREATE SCHEMA
statement
*/
(
TempTableID INT NOT NULL IDENTITY(1,1)
, SomeData VARCHAR(50) NOT NULL
);
GO
INSERT INTO tempdb.SomeSchema.#MyTempTable (SomeData) VALUES ('This is a test');
SELECT *
FROM tempdb.SomeSchema.#MyTempTable;
GO
SELECT *
FROM sys.objects o
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'SomeSchema';
SELECT s.name
, o.name
FROM sys.objects o
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'dbo'
AND o.name LIKE '%MyTempTable%';
DROP SCHEMA SomeSchema;
DROP TABLE #MyTempTable;
Lo anterior debería crear una tabla temporal nombrada #MyTempTable
en tempdb bajo el esquema nombrado SomeSchema
; Sin embargo no lo hace. En cambio, la tabla se crea en el dbo
esquema.
¿Es este comportamiento esperado? Me doy cuenta de que este es sin duda un caso extremo en torno al uso de tablas temporales específicas del esquema; sin embargo, sería bueno si el motor proporcionara un error al intentar crear una tabla temporal vinculada al esquema, o si realmente lo vinculó al esquema especificado en el DDL.
Además, actualmente no tengo acceso a SQL Server 2014 o 2016; ¿Funciona como se espera en esas plataformas?