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 eltempdb
papel, 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
dropping
volver a crear la tabla temporal, puedetruncate
reutilizarlaSi está utilizando
Sql Server 2016
oAzure Sql Database
luego utiliza la sintaxis siguiente para descartar la tabla temporal y volver a crearla. Más información aquí MSDNSintaxis
Consulta:
fuente
truncate/reuse
método sería más eficiente que elDROP TABLE IF EXISTS
encendidoSql Server 2016
yAzure Sql Database
también. ¿No es este el caso?DROP TABLE IF Exists
para 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 TABLE
es compatible con SQL Server 2008, pero laIF EXISTS
clá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 #Results
no 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 SQLtempdb
o 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_ID
que 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] EXISTS
clá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
Source
tabla que cambia y unaDestination
tabla 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