ver una todas tiene tablas tabla saber relacionadas que obtener listar las estructura estan datos cuantas como columnas bases sql-server-2005 schema

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