ver valor una tables tabla saber relaciones por las information_schema foreign constraint como columns columna campo alterar agregar sql sql-server tsql information-schema

valor - ver constraints de una tabla sql server



¿Cómo encuentro una restricción predeterminada usando INFORMATION_SCHEMA? (13)

¿La columna COLUMN_DEFAULT de INFORMATION_SCHEMA.COLUMNS es lo que está buscando?

Estoy tratando de probar si existe una restricción predeterminada dada. No quiero usar la tabla sysobjects, pero el más estándar INFORMATION_SCHEMA.

Lo he usado para verificar tablas y restricciones de claves primarias antes, pero no veo restricciones predeterminadas en ninguna parte.

¿No están allí? (Estoy usando MS SQL Server 2000).

EDITAR: Estoy buscando para obtener el nombre de la restricción.


¿Qué le parece usar una combinación de CHECK_CONSTRAINTS y ​​CONSTRAINT_COLUMN_USAGE:

select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name from information_schema.columns columns inner join information_schema.constraint_column_usage usage on columns.column_name = usage.column_name and columns.table_name = usage.table_name inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name where columns.column_default is not null


Estoy utilizando el siguiente script para recuperar todos los valores predeterminados (sp_binddefaults) y todas las restricciones predeterminadas con los siguientes scripts:

SELECT t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName FROM sys.all_columns c JOIN sys.tables t ON c.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name) WHERE SC.COLUMN_DEFAULT IS NOT NULL --WHERE t.name = '''' and c.name = ''''


La siguiente secuencia de comandos enumera todas las restricciones predeterminadas y los valores predeterminados para las tablas de usuario en la base de datos en la que se está ejecutando:

SELECT b.name AS TABLE_NAME, d.name AS COLUMN_NAME, a.name AS CONSTRAINT_NAME, c.text AS DEFAULT_VALUE FROM sys.sysobjects a INNER JOIN (SELECT name, id FROM sys.sysobjects WHERE xtype = ''U'') b on (a.parent_obj = b.id) INNER JOIN sys.syscomments c ON (a.id = c.id) INNER JOIN sys.syscolumns d ON (d.cdefault = a.id) WHERE a.xtype = ''D'' ORDER BY b.name, a.name


No creo que esté en INFORMATION_SCHEMA; probablemente tendrá que usar sysobjects o tablas / vistas en desuso relacionadas.

Podría pensar que habría un tipo para esto en INFORMATION_SCHEMA.TABLE_CONSTRAINTS, pero no veo uno.


Parece que no hay nombres de restricciones predeterminadas en las vistas de Information_Schema .

use SELECT * FROM sysobjects WHERE xtype = ''D'' AND name = @name para encontrar una restricción predeterminada por nombre


Probablemente porque en algunos de los otros DBMS SQL la "restricción predeterminada" no es realmente una restricción, no encontrará su nombre en "INFORMATION_SCHEMA.TABLE_CONSTRAINTS", por lo que su mejor opción es "INFORMATION_SCHEMA.COLUMNS", como ya se ha mencionado.

(SQLServer-ignoramus aquí)

La única razón por la que puedo pensar cuando debe conocer el nombre de la "restricción predeterminada" es si SQLServer no admite el comando "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..." . Pero entonces ya se encuentra en una zona no estándar y debe usar las formas específicas del producto para obtener lo que necesita.


Puede usar lo siguiente para restringir aún más los resultados al especificar el Nombre de tabla y el Nombre de columna a los que se correlaciona la Restricción predeterminada:

select * from sysobjects o inner join syscolumns c on o.id = c.cdefault inner join sysobjects t on c.id = t.id where o.xtype = ''D'' and c.name = ''Column_Name'' and t.name = ''Table_Name''


Según tengo entendido, las restricciones de valor predeterminadas no son parte del estándar ISO, por lo que no aparecen en INFORMATION_SCHEMA. INFORMATION_SCHEMA parece ser la mejor opción para este tipo de tarea porque es multiplataforma, pero si la información no está disponible, se deben usar las vistas de catálogo de objetos (sys. *) En lugar de las vistas de tablas del sistema, que están en desuso en SQL Server. 2005 y más tarde.

A continuación, es más o menos lo mismo que la respuesta de @ user186476. Devuelve el nombre de la restricción de valor predeterminada para una columna determinada. (Para los usuarios que no son servidores SQL, necesita el nombre predeterminado para soltarlo, y si usted no nombra la restricción predeterminada usted mismo, SQL Server crea un nombre loco como "DF_TableN_Colum_95AFE4B5". Para que sea más fácil cambiar su esquema en el futuro, siempre nombre explícitamente sus restricciones!)

-- returns name of a column''s default value constraint SELECT default_constraints.name FROM sys.all_columns INNER JOIN sys.tables ON all_columns.object_id = tables.object_id INNER JOIN sys.schemas ON tables.schema_id = schemas.schema_id INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id WHERE schemas.name = ''dbo'' AND tables.name = ''tablename'' AND all_columns.name = ''columnname''


Si desea obtener una restricción mediante los nombres de columna o tabla, o si desea obtener todas las restricciones en la base de datos, busque otras respuestas. Sin embargo, si solo está buscando exactamente lo que pregunta, es decir, "probar si existe una restricción predeterminada dada ... por el nombre de la restricción" , entonces hay una manera mucho más sencilla.

Aquí hay una respuesta a prueba de futuro que no usa los sysobjects u otras tablas de sistema en absoluto:

IF object_id(''DF_CONSTRAINT_NAME'', ''D'') IS NOT NULL BEGIN -- constraint exists, work with it. END


Vista del catálogo de objetos : sys.default_constraints

Las vistas del esquema de información INFORMATION_SCHEMA cumplen con ANSI, pero las restricciones predeterminadas no son parte del estándar ISO. Microsoft SQL Server proporciona vistas de catálogo del sistema para obtener información sobre los metadatos de los objetos de SQL Server.

sys.default_constraints vista del catálogo del sistema utilizada para obtener la información sobre las restricciones predeterminadas.

SELECT so.object_id TableName, ss.name AS TableSchema, cc.name AS Name, cc.object_id AS ObjectID, sc.name AS ColumnName, cc.parent_column_id AS ColumnID, cc.definition AS Defination, CONVERT(BIT, CASE cc.is_system_named WHEN 1 THEN 1 ELSE 0 END) AS IsSystemNamed, cc.create_date AS CreationDate, cc.modify_date AS LastModifiednDate FROM sys.default_constraints cc WITH (NOLOCK) INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id AND sc.object_id = cc.parent_object_id ORDER BY so.name, cc.name;


select c.name, col.name from sys.default_constraints c inner join sys.columns col on col.default_object_id = c.object_id inner join sys.objects o on o.object_id = c.parent_object_id inner join sys.schemas s on s.schema_id = o.schema_id where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName


WHILE EXISTS( SELECT * FROM sys.all_columns INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id INNER JOIN sys.schemas ON ST.schema_id = schemas.schema_id INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id WHERE schemas.name = ''dbo'' AND ST.name = ''MyTable'' ) BEGIN DECLARE @SQL NVARCHAR(MAX) = N''''; SET @SQL = ( SELECT TOP 1 ''ALTER TABLE [''+ schemas.name + ''].['' + ST.name + ''] DROP CONSTRAINT '' + default_constraints.name + '';'' FROM sys.all_columns INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id INNER JOIN sys.schemas ON ST.schema_id = schemas.schema_id INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id WHERE schemas.name = ''dbo'' AND ST.name = ''MyTable'' ) PRINT @SQL EXECUTE sp_executesql @SQL --End if Error IF @@ERROR <> 0 BREAK END