verificar ver validar una tabla saber existe eliminar crear columna borrar sql-server sql-server-2005 temp-tables alter-table

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, )



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.

  1. Alterar declaración para la mesa.
  2. IR
  3. 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