Hoy al estar buscando la solución a un generador de código que solo era capaz de trabajar con MySql y que ahora se requiere funcione con SqlServer.
Me tope con varios problemas, da la casualidad que en estos 2 manejadores las consultas a los metadatos se realizan de una manera muy diferente (era de suponerse) .
basicamente los 3 problemas que encontre fuerón.
- Conocer los campos de una tabla.
- Conocer las PK de la tabla
- Conocer las FK de la tabla
Esto con MySql se obtiene con la consulta.(Las tres opciones)
describe NombreTabla;
En cambio en SqlServer es un poco mas complejo.
Conocer los campos de una tabla.
SELECT sc.name
FROM sys.objects so
INNER JOIN sys.columns sc ON so.[object_id]=sc.[object_id]
WHERE so.name='Tabla'
Conocer las PK de la tabla
SELECT i.name AS IndexName,OBJECT_NAME(ic.OBJECT_ID) AS TableName,COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i INNER JOIN sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID
AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
and OBJECT_NAME(ic.OBJECT_ID) = 'Tabla'
Conocer las FK de la tabla
SELECT fk.name AS FK,
OBJECT_NAME(fk.parent_object_id) AS TableName,COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,OBJECT_NAME (fk.referenced_object_id) AS ReferenceTableName,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fc ON fk.OBJECT_ID = fc.constraint_object_id
where OBJECT_NAME(fk.parent_object_id) = 'Tabla'
Estas consultas me fuerón de mucha utilidad. Las consultas las encontre en estos 2 Blogs que la verdad suenan muy interesantes y en mi caso me sirvierón bastante.
via : http://blog.sqlauthority.com
via : http://sqlpsykrest.wordpress.com