web-dev-qa-db-fra.com

TSQL sélectionne dans la table temporaire à partir de SQL dynamique

Cela semble relativement simple, mais apparemment ce n’est pas le cas.

J'ai besoin de créer une table temporaire basée sur une table existante via la syntaxe select into:

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

Le problème est que le nom de la table existante est accepté via un paramètre ...

Je peux obtenir les données de la table via:

execute ('SELECT * FROM ' + @tableName)

mais comment puis-je épouser les deux afin que je puisse mettre les résultats de l'exécuter directement dans la table temporaire.

Les colonnes de chaque table pour laquelle elle sera utilisée ne sont pas les mêmes. Il n'est donc pas pratique de construire la table temporaire avant d'obtenir les données.

Je suis ouvert à toute suggestion, sauf l'utilisation d'une table de temp globale.

Mettre à jour:

C’est complètement ridicule, MAIS ma réserve avec la table temporaire globale est qu’il s’agit d’une plate-forme multi-utilisateurs qui se prête bien aux problèmes si la table s’attarde pendant de longues périodes ...

Sooo .. juste pour passer outre cette partie, j'ai commencé par utiliser l'exécutable pour générer une table temporaire globale.

execute('select * into ##globalDynamicFormTable from ' + @tsFormTable) 

J'utilise ensuite la table temp globale pour charger la table temp locale:

select * into #tempTable from ##globalDynamicFormTable

Je laisse alors tomber la table globale.

drop table ##globalDynamicFormTable

c'est sale et je n'aime pas ça, mais pour le moment, jusqu'à ce que j'obtienne une meilleure solution, il va falloir que ça fonctionne.

À la fin:

Je suppose qu'il n'y a aucun moyen de le contourner. 

La meilleure réponse semble être l'un ou l'autre;

Créez un view dans la commande d'exécution et utilisez-le pour charger la table temporaire locale dans la procédure stockée.

Créez une table global temp dans la commande d'exécution et utilisez-la pour charger la table temporaire locale. 

Cela dit, je vais probablement m'en tenir à la table temporaire globale, car la création et la suppression de vues font l'objet d'un audit dans mon organisation, et je suis sûr qu'ils vont se demander si cela se produit tout le temps.

Merci!

17
Patrick

Un exemple de travail.

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YourTableName'

EXECUTE ('SELECT * INTO #TEMP  FROM ' + @TableName +'; SELECT * FROM #TEMP;')

Deuxième solution avec table temporaire accessible 

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YOUR_TABLE_NAME'

EXECUTE ('CREATE VIEW vTemp AS
        SELECT *
        FROM ' + @TableName)
SELECT * INTO #TEMP  FROM vTemp 

--DROP THE VIEW HERE      
DROP VIEW vTemp

/*START USING TEMP TABLE
************************/
--EX:
SELECT * FROM #TEMP


--DROP YOUR TEMP TABLE HERE
DROP TABLE #TEMP
20
Kaf
declare @sql varchar(100);

declare @tablename as varchar(100);

select @tablename = 'your_table_name';

create table #tmp 
    (col1 int, col2 int, col3 int);

set @sql = 'select aa, bb, cc from ' + @tablename;

insert into #tmp(col1, col2, col3) exec @sql;

select * from #tmp;
1
Hayk

Comment je l'ai fait avec un pivot dans SQL dynamique (#AccPurch a été créé auparavant)

DECLARE @sql AS nvarchar(MAX)
declare @Month Nvarchar(1000)

--DROP TABLE #temp
select distinct YYYYMM into #temp from #AccPurch AS ap
SELECT  @Month = COALESCE(@Month, '') + '[' + CAST(YYYYMM AS VarChar(8)) + '],' FROM    #temp

SELECT   @Month= LEFT(@Month,len(@Month)-1)


SET @sql = N'SELECT UserID, '+ @Month + N' into ##final_Donovan_12345 FROM (
Select ap.AccPurch ,
       ap.YYYYMM ,
       ap.UserID ,
       ap.AccountNumber
FROM #AccPurch AS ap 
) p
Pivot (SUM(AccPurch) FOR YYYYMM IN ('+@Month+ N')) as pvt'


EXEC sp_executesql @sql

Select * INTO #final From ##final_Donovan_12345

DROP TABLE  ##final_Donovan_12345

Select * From #final AS f
0
Donovan Paul Froon