Einfacher Prüfstand:
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;
Das Obige sollte eine temporäre Tabelle erstellen, die #MyTempTable
in der Tempdb unter dem angegebenen Schema benannt ist SomeSchema
. dies ist jedoch nicht der Fall. Stattdessen wird die Tabelle im dbo
Schema erstellt.
Ist das erwartetes Verhalten? Mir ist klar, dass dies sicherlich ein Randfall bei der Verwendung schemaspezifischer temporärer Tabellen ist. Es wäre jedoch schön, wenn die Engine beim Versuch, eine schemagebundene temporäre Tabelle zu erstellen, entweder einen Fehler liefern würde oder sie tatsächlich an das in der DDL angegebene Schema binden würde.
Außerdem habe ich derzeit keinen Zugriff auf SQL Server 2014 oder 2016. Funktioniert es auf diesen Plattformen wie erwartet?