Voglio essere in grado di inserire i dati da una tabella con una colonna di identità in una tabella temporanea in SQL Server 2005.Come cadere proprietà IDENTITY di colonna in SQL Server 2005
Il TSQL simile a:
-- Create empty temp table
SELECT *
INTO #Tmp_MyTable
FROM MyTable
WHERE 1=0
...
WHILE ...
BEGIN
...
INSERT INTO #Tmp_MyTable
SELECT TOP (@n) *
FROM MyTable
...
END
il codice precedente creato #Tmp_Table con una colonna di identità, e l'inserto in seguito ha esito negativo con un errore "un valore esplicito per la colonna identity nella tabella '#Tmp_MyTable' può essere specificato solo quando un elenco di colonne viene utilizzato e IDENTITY_INSERT è acceso. "
C'è un modo in TSQL per eliminare la proprietà identity della colonna nella tabella temporanea senza elencare tutte le colonne esplicitamente? Voglio specificamente utilizzare "SELECT *" in modo che il codice continui a funzionare se vengono aggiunte nuove colonne a MyTable.
Credo che l'interruzione e la ricreazione della colonna cambieranno la sua posizione, rendendo impossibile l'utilizzo di SELECT *.
Aggiornamento:
Ho provato con IDENTITY_INSERT come suggerito in una risposta. Non funziona - vedi la riproduzione qui sotto. Che cosa sto facendo di sbagliato?
-- Create test table
CREATE TABLE [dbo].[TestTable](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
-- Insert some data
INSERT INTO TestTable
(Name)
SELECT 'One'
UNION ALL
SELECT 'Two'
UNION ALL
SELECT 'Three'
GO
-- Create empty temp table
SELECT *
INTO #Tmp
FROM TestTable
WHERE 1=0
SET IDENTITY_INSERT #Tmp ON -- I also tried OFF/ON
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
SET IDENTITY_INSERT #Tmp OFF
GO
-- Drop test table
DROP TABLE [dbo].[TestTable]
GO
Si noti che il messaggio di errore "un valore esplicito per la colonna Identity nella tabella '#TmpMyTable' può essere specificato solo quando un elenco di colonne viene utilizzato e IDENTITY_INSERT è ON." - In particolare non voglio usare un elenco di colonne come spiegato sopra.
Update 2 Provato the suggestion from Mike ma questo ha dato lo stesso errore:
-- Create empty temp table
SELECT *
INTO #Tmp
FROM (SELECT
m1.*
FROM TestTable m1
LEFT OUTER JOIN TestTable m2 ON m1.ID=m2.ID
WHERE 1=0
) dt
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Per quanto riguarda il motivo per cui voglio fare questo: MyTable è una tabella di gestione temporanea che può contenere un gran numero di righe da unire in un altro tavolo. Voglio elaborare le righe dalla tabella di staging, inserire/aggiornare la mia tabella principale ed eliminarle dalla tabella di staging in un ciclo che elabora N righe per transazione. Mi rendo conto che ci sono altri modi per raggiungere questo obiettivo.
Update 3
non ho potuto ottenere Mike's solution al lavoro, tuttavia suggerito la soluzione seguente, che funziona: il prefisso con una colonna non-identità e cadere la colonna di identità:
SELECT CAST(1 AS NUMERIC(18,0)) AS ID2, *
INTO #Tmp
FROM TestTable
WHERE 1=0
ALTER TABLE #Tmp DROP COLUMN ID
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Anche il suggerimento di Mike di memorizzare solo le chiavi nella tabella temporanea è buono, sebbene in questo caso specifico ci siano motivi per cui preferisco avere tutte le colonne nella tabella temporanea.
funziona per me, mi vedono risposta ... –
soluzione È nell'aggiornamento 3 funziona benissimo per me. Stavo cercando di ottenere l'OUTPUT di un UPDATE in una tabella temporanea senza specificare le colonne (circa 100!) – apc