sql server - ver - Compruebe si existe una tabla temporal y elimínela si existe antes de crear una tabla temporal
validar si existe una columna sql server (13)
Ahora puede usar la siguiente sintaxis si está usando una de las nuevas versiones de SSMS
DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
Estoy usando el siguiente código para verificar si la tabla temporal existe y eliminar la tabla si existe antes de crearla nuevamente. Funciona bien siempre y cuando no cambie las columnas. Si agrego una columna más tarde, dará un error que dice "columna inválida". Por favor déjame saber lo que estoy haciendo mal.
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
Creo que el problema es que necesita agregar una instrucción GO para separar la ejecución en lotes. Como la segunda secuencia de comandos, es decir, IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL DROP TABLE #Results
no eliminaron la tabla temporal como parte de un solo lote. ¿Puedes probar el siguiente script?
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
GO
select company, stepid, fieldid from #Results
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
GO
select company, stepid, fieldid, NewColumn from #Results
En lugar de dropping
y volver a crear la tabla temporal, puede truncate
y reutilizarla
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL
Truncate TABLE #Results
else
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
Si está utilizando Sql Server 2016
o Azure Sql Database
, use la siguiente sintaxis para eliminar la tabla temporal y volver a crearla. Más información aquí MSDN
Sintaxis
DROP TABLE [IF EXISTS] [database_name. [schema_name]. | nombre_esquema. ] nombre_tabla [, ... n]
Consulta:
DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
Esto me funcionó: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
if exists (
select * from tempdb.dbo.sysobjects o
where o.xtype in (''U'')
and o.id = object_id(N''tempdb..#tempTable'')
)
DROP TABLE #tempTable;
Hace poco vi a un DBA hacer algo similar a esto:
begin try
drop table #temp
end try
begin catch
print ''table does not exist''
end catch
create table #temp(a int, b int)
La declaración debe ser del orden.
- Alterar declaración para la mesa.
- IR
- Seleccione declaración.
Sin ''GO'' en el medio, todo se considerará como un solo script y cuando la instrucción de selección busque la columna, no se encontrará.
Con ''GO'', considerará la parte del script hasta ''GO'' como un solo lote y se ejecutará antes de entrar en la consulta después de ''GO''.
Mi código utiliza una tabla de Source
que cambia y una tabla de Destination
que debe coincidir con esos cambios.
--
-- Sample SQL to update only rows in a "Destination" Table
-- based on only rows that have changed in a "Source" table
--
--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID(''tempdb..#tSource'') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)
--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID(''tempdb..#tDest'') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource
--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest
--
-- Make some changes to the Source
--
update #tSource
Set Col3=19
Where Col1=1
update #tSource
Set Col3=29
Where Col1=2
update #tSource
Set Col2=38
Where Col1=3
update #tSource
Set Col2=48
Where Col1=4
--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
Set Col2=S.Col2,
Col3=S.Col3,
Col4=S.Col4
From ( Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
) S
Where #tDest.Col1=S.Col1
--
-- Look at the tables again to see that
-- the destination table has changed to match
-- the source table.
select *
from #tSource
Select *
from #tDest
--
-- Clean Up
--
drop table #tSource
drop table #tDest
No puedo reproducir el error.
Quizás no estoy entendiendo el problema.
Lo siguiente funciona bien para mí en SQL Server 2005, con la columna "foo" adicional que aparece en el segundo resultado de selección:
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID(''tempdb..#Results'') IS NOT NULL DROP TABLE #Results
GO
Normalmente hago este error cuando ya he creado la tabla temporal; el código que verifica la declaración SQL en busca de errores ve la tabla temporal "antigua" en su lugar y devuelve un error en el número de columnas en declaraciones posteriores, como si la tabla temporal nunca se eliminara.
Después de cambiar el número de columnas en una tabla temporal después de haber creado una versión con menos columnas, suelte la tabla y LUEGO ejecute su consulta.
Sí, "columna inválida" este error surgió de la línea "seleccionar compañía, stepid, fieldid, NewColumn from #Results".
Hay dos fases de ejecución t-sql,
primero, analizando, en esta fase el servidor de SQL comprueba la corrección de su cadena de SQL incluida, incluida la columna de la tabla, y optimizó su consulta para obtener el retorno más rápido.
En segundo lugar, correr, recuperar los datos.
Si la tabla #Resultados existe, entonces el proceso de análisis verificará si las columnas que especificó son válidas o no, de lo contrario (la tabla no existe) el análisis pasará las columnas de verificación como usted especificó.
Solo un pequeño comentario de mi parte, ya que el OBJECT_ID
no funciona para mí. Siempre devuelve eso
`#tempTable no existe
... aunque existe. Acabo de encontrar que está almacenado con un nombre diferente (postfixeado por _
guiones bajos) así:
#tempTable________
Esto funciona bien para mi:
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like ''#tempTable%'') BEGIN
DROP TABLE #tempTable;
END;
pmac72 utiliza GO para desglosar la consulta en lotes y utiliza un ALTER.
Parece que está ejecutando el mismo lote pero ejecutándolo dos veces después de cambiarlo: DROP ... CREAR ... editar ... DROP ... CREAR ...
Tal vez publique su código exacto para que podamos ver lo que está pasando.
CREATE TABLE #tempTable (id int IDENTITY(1, 1) PRIMARY KEY, name nvarchar(500), value nvarchar(500))
BEGIN TRY
DELETE FROM #tempTable
PRINT ''Table deleted''
END TRY
BEGIN CATCH
PRINT ''Table does not exist''
END CATCH