sql-server-2005 - una - obtener estructura de tabla sql server
¿Cómo consulto si existe un esquema de base de datos? (3)
¿Estás buscando sys.schemas ?
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = ''jim'')
BEGIN
EXEC(''CREATE SCHEMA jim'')
END
Tenga en cuenta que CREATE SCHEMA
debe ejecutarse en su propio lote (según la respuesta a continuación )
Como parte de nuestro proceso de compilación, ejecutamos un script de actualización de base de datos a medida que implementamos el código en 4 entornos diferentes. Además, dado que se agregará la misma consulta hasta que sueltemos una versión en producción, tiene que poder ejecutarse varias veces en una base de datos determinada. Me gusta esto:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N''[Table]''))
BEGIN
CREATE TABLE [Table]
(...)
END
Actualmente tengo una declaración de esquema de creación en el script de implementación / compilación. ¿Dónde consulto la existencia de un esquema?
@bdukes tiene razón para determinar si el esquema existe, pero la declaración anterior no funcionará en SQL Server 2005. CREATE SCHEMA <name>
necesita ejecutarse en su propio lote. Una CREATE SCHEMA
es ejecutar la CREATE SCHEMA
en un ejecutivo.
Esto es lo que utilicé en mis scripts de compilación:
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = ''<name>'')
BEGIN
-- The schema must be run in its own batch!
EXEC( ''CREATE SCHEMA <name>'' );
END
Para ser más "defensiva", la siguiente versión genera un error de conversión tipo para considerar la posibilidad (aunque poco probable) de> 1 coincidencia de Schema
similar a cómo el código de validación a menudo intencionalmente tira Excepción porque creo que es bueno y creo es una '''' mejor práctica '''' para dar cuenta de todos los resultados de retorno posibles aunque poco probable e incluso si solo se trata de generar una excepción fatal porque los efectos conocidos de detener el procesamiento suelen ser mejores que los efectos en cascada desconocidos de los errores no atrapados. Debido a que es muy poco probable, no creo que valga la pena tener un Count
separado de Count
+ Throw
o Try
- Catch
- Throw
para generar un error fatal más fácil de usar pero aún así un error fatal.
SS 2005-:
declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower(''SchemaX'')) when 1 then 1 when 0 then 0 else ''ERROR'' end
SS 2008+:
declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower(''SchemaX'')) when 1 then 1 when 0 then 0 else ''ERROR'' end
Entonces:
if @HasSchemaX = 1
begin
...
end -- if @HasSchemaX = 1