wake-up-neo.com

TSQL-Auswahl in Temp-Tabelle aus dynamischem SQL

Dies scheint relativ einfach zu sein, ist es aber anscheinend nicht.

Ich muss eine temporäre Tabelle basierend auf einer vorhandenen Tabelle über die Select-in-Syntax erstellen:

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

Das Problem ist, dass der vorhandene Tabellenname über einen Parameter akzeptiert wird ...

Ich kann die Daten der Tabelle erhalten über:

execute ('SELECT * FROM ' + @tableName)

aber wie heirate ich die beiden so, dass ich die ergebnisse direkt in die temporäre tabelle eingeben kann.

Die Spalten für jede Tabelle, für die diese Tabelle verwendet wird, sind nicht gleich. Das Erstellen der temporären Tabelle vor dem Abrufen der Daten ist nicht praktikabel.

Ich bin offen für alle Vorschläge außer der Verwendung einer globalen Temp-Tabelle.

Update:

Das ist völlig lächerlich, ABER meine Vorbehalte bei der globalen temporären Tabelle sind, dass dies eine Plattform für mehrere Benutzer ist, die sich für Probleme eignet, wenn die Tabelle lange Zeit verweilt ...

Sooo ... Um an diesem Teil vorbei zu kommen, habe ich damit begonnen, eine globale Temp-Tabelle zu erzeugen.

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

Ich verwende dann die globale Temp-Tabelle, um die lokale Temp-Tabelle zu laden:

select * into #tempTable from ##globalDynamicFormTable

Ich lasse dann die globale Tabelle fallen.

drop table ##globalDynamicFormTable

das ist schmutzig und ich mag es nicht, aber bis ich eine bessere Lösung habe, muss es funktionieren.

Schlussendlich:

Ich vermute, es gibt keine Möglichkeit, es zu umgehen. 

Die beste Antwort scheint entweder zu sein;

Erstellen Sie im Ausführungsbefehl ein view und laden Sie damit die lokale temporäre Tabelle in der gespeicherten Prozedur.

Erstellen Sie eine globale Temp-Tabelle im Ausführungsbefehl und verwenden Sie diese zum Laden der lokalen Temp-Tabelle. 

Mit dem besagten werde ich wahrscheinlich nur bei der globalen temporären Tabelle bleiben, da das Erstellen und Löschen von Ansichten in meiner Organisation geprüft wird. Ich bin mir sicher, dass sie die Frage stellen werden, ob dies ständig geschieht.

Vielen Dank!

17
Patrick

Ein funktionierendes Beispiel.

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

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

Zweite Lösung mit begehbarer Temp-Tabelle 

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

Wie ich es mit einem Pivot in dynamischer SQL getan habe (#AccPurch wurde zuvor erstellt)

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 ('[email protected]+ 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