Banc d'essai 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;
Ce qui précède doit créer une table temporaire nommée #MyTempTable
dans la tempdb sous le schéma nommé SomeSchema
; mais ce n'est pas le cas. Au lieu de cela, la table est créée dans le dbo
schéma.
Est-ce un comportement attendu? Je me rends compte que c'est certainement un cas limite autour de l'utilisation de tables temporaires spécifiques au schéma; cependant, ce serait bien si le moteur fournissait une erreur lors de la tentative de création d'une table temporaire liée au schéma, ou s'il le liait réellement au schéma spécifié dans la DDL.
De plus, je n'ai actuellement pas accès à SQL Server 2014 ou 2016; ça marche comme prévu sur ces plateformes?
sql-server
sql-server-2008-r2
sql-server-2012
tempdb
Max Vernon
la source
la source
Réponses:
Les deux références sont valides et se résoudront correctement, mais la table #temp est créée sous le
dbo
schéma.Même réponse (sur votre système, un nombre que je ne pouvais pas deviner):
Même réponse (les deux 1, qui est
dbo
):Pouvoir spécifier un schéma ne vous rapporte rien parce que vous n'allez pas avoir de collisions (deux tables #temp du même nom sous des schémas différents) au cours d'une session, non?
Il s'agit d'un comportement attendu. Une table #temp est liée à une session, mais pas à un schéma spécifique. Et cela fonctionne de la même manière jusqu'à 2016 CTP 3.2. L'analyseur pardonne probablement, autorisant le nom de schéma vide de sens de la même manière qu'il autorise cette virgule de fin errante:
la source