Estoy usando el siguiente código para verificar si la tabla temporal existe y soltar la tabla si existe antes de crear nuevamente. Funciona bien siempre que no cambie las columnas. Si agrego una columna más tarde, aparecerá un error que dice "columna no válida". Por favor, hágame 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

BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT. Si la transacción tiene éxito, la tabla se eliminará. Si falla, la tabla también desaparecerá (ya que se creó dentro de la transacción). En cualquier caso: no es necesario verificar si la tabla ya existe.Respuestas:
No puedo reproducir el error.
Quizás no entiendo 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:
fuente
'tempdb..#name'es exactamente lo que necesitaba Estaba usando'dbo.#name', como un tonto. Me sale eltempdbpapel, pero ¿qué pasa con los puntos dobles?La declaración debe ser del orden
Sin 'GO' en el medio, todo se considerará como un solo script y cuando la instrucción select busca 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'.
fuente
En lugar de
droppingvolver a crear la tabla temporal, puedetruncatereutilizarlaSi está utilizando
Sql Server 2016oAzure Sql Databaseluego utiliza la sintaxis siguiente para descartar la tabla temporal y volver a crearla. Más información aquí MSDNSintaxis
Consulta:
fuente
truncate/reusemétodo sería más eficiente que elDROP TABLE IF EXISTSencendidoSql Server 2016yAzure Sql Databasetambién. ¿No es este el caso?DROP TABLE IF Existspara SQL 2016 o Azure? La sintaxis está disponible a partir de SQL 2008. ¿Ver el enlace de MSDN en su respuesta? Factor de rendimiento?DROP TABLEes compatible con SQL Server 2008, pero laIF EXISTScláusula se introdujo en 2016.INTO: seleccione * INTO #HistoricoUserTable de dbo.HistoricoUserCreo que el problema es que necesita agregar una declaración GO en el medio para separar la ejecución en lotes. Como el segundo script de caída, es decir,
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Resultsno dejó caer la tabla temporal como parte de un solo lote. ¿Puedes probar el siguiente script?fuente
tempdb..en el código de arriba es muy importante. Debe preceder al nombre de la tabla temporal. Simplemente verificarOBJECT_ID('#Results')no es suficiente. Las tablas temporales se almacenan en la base de datos TempDB. Según Microsoft: la base de datos del sistema TempDB es un recurso global que está disponible para todos los usuarios conectados a la instancia de SQL Server o conectados a la base de datos SQLtempdbo no desaparecerá.Esto podría lograrse con una sola línea de código:
fuente
Esto funcionó para mí: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
fuente
Solo un pequeño comentario de mi parte ya
OBJECT_IDque no funciona para mí. Siempre devuelve eso..even pesar de que hace existir. Acabo de encontrar que está almacenado con un nombre diferente (pospuesto con
_guiones bajos) así:#tempTable________Esto funciona bien para mi:
fuente
Ahora puede usar la sintaxis a continuación si está utilizando una de las nuevas versiones de SQL Server (2016+).
fuente
Incorrect syntax near the keyword 'IF'.IF [NOT] EXISTScláusula está disponible en SQL Server 2016. No importa qué versión de SSMS esté utilizando.pmac72 está usando GO para dividir la consulta en lotes y está usando ALTER.
Parece que está ejecutando el mismo lote pero ejecutándolo dos veces después de cambiarlo: DROP ... CREATE ... edit ... DROP ... CREATE ..
Quizás publique su código exacto para que podamos ver lo que está sucediendo.
fuente
Por lo general, aparece este error cuando ya he creado la tabla temporal; el código que verifica la instrucción SQL en busca de errores ve la tabla temporal "antigua" en su lugar y devuelve un recuento incorrecto del número de columnas en las declaraciones posteriores, como si la tabla temporal nunca se descartara.
Después de cambiar el número de columnas en una tabla temporal después de crear una versión con menos columnas, suelte la tabla y LUEGO ejecute su consulta.
fuente
Hace poco vi un DBA hacer algo similar a esto:
fuente
Mi código usa una
Sourcetabla que cambia y unaDestinationtabla que debe coincidir con esos cambios.fuente
Sí, "columna no válida", este error surgió de la línea "seleccionar empresa, stepid, fieldid, NewColumn de #Results".
Hay dos fases de ejecución de t-sql,
primero, analizando, en esta fase, el servidor sql verifica la corrección de la cadena sql enviada, incluida la columna de la tabla, y optimiza su consulta para una recuperación más rápida.
segundo, corriendo, recuperando los datos.
Si la tabla #Results existe, el proceso de análisis verificará que las columnas que especificó sean válidas o no, de lo contrario (la tabla no existe) el análisis se pasará por las columnas de comprobación como usted especificó.
fuente
Cuando cambia una columna en una tabla temporal, debe soltar la tabla antes de volver a ejecutar la consulta. (Sí, es molesto. Justo lo que tienes que hacer).
Siempre he asumido que esto se debe a que el analizador realiza la comprobación de "columna no válida" antes de ejecutar la consulta, por lo que se basa en las columnas de la tabla antes de que se descarte ... y eso es lo que pnbs también dijo.
fuente