人大金仓多个schema中存在同名表,并且表结构不一致,会导致数据类型错乱 返回

SqlSugar 沟通中
6 703

image.png


image.png



image.png



SELECT

schemaname,

CAST ( pclass.OID AS INT4 ) AS TableId,

CAST ( ptables.tablename AS VARCHAR ) AS TableName,

pcolumn.COLUMN_NAME AS DbColumnName,

pcolumn.udt_name AS DataType,

pcolumn.character_maximum_length AS LENGTH,

pcolumn.column_default AS DefaultValue,

col_description ( pclass.OID, pcolumn.ordinal_position ) AS ColumnDescription,

CASE

WHEN pkey.colname = pcolumn.COLUMN_NAME THEN

TRUE ELSE FALSE 

END AS IsPrimaryKey,

CASE

WHEN UPPER ( pcolumn.column_default ) LIKE'NEXTVAL%' THEN

TRUE ELSE FALSE 

END AS IsIdentity,

CASE

WHEN UPPER ( pcolumn.is_nullable ) = 'YES' THEN

TRUE ELSE FALSE 

END AS IsNullable 

FROM

( SELECT * FROM sys_tables WHERE UPPER ( tablename ) = UPPER ( 'tb_base_eq_archives' ) AND LOWER ( schemaname ) = 'erp_base' ) ptables

INNER JOIN sys_class pclass ON ptables.tablename = pclass.relname AND relnamespace = ( SELECT OID FROM pg_namespace WHERE nspname = 'erp_base' )

INNER JOIN ( SELECT * FROM information_schema.COLUMNS WHERE table_schema = 'erp_base' ) pcolumn ON pcolumn.TABLE_NAME = ptables.tablename

LEFT JOIN (

SELECT

sys_class.relname,

sys_attribute.attname AS colname 

FROM

sys_constraint

INNER JOIN sys_class ON sys_constraint.conrelid = sys_class.OID AND sys_class.relnamespace = ( SELECT OID FROM pg_namespace WHERE nspname = 'erp_base' )

INNER JOIN sys_attribute ON sys_attribute.attrelid = sys_class.OID 

AND sys_attribute.attnum = sys_constraint.conkey [ 1 ]

INNER JOIN sys_type ON sys_type.OID = sys_attribute.atttypid 

WHERE

sys_constraint.contype = 'p' 

) pkey ON pcolumn.TABLE_NAME = pkey.relname 

ORDER BY

ptables.tablename,

pcolumn.COLUMN_NAME



热忱回答6

  • fate sta fate sta VIP0
    2024/8/26

    金仓哪个模式

    0 回复
  • image.png


    mysql与oracle都有这个问题,发现的就是这个地方取值有问题,没有指定schema来取值,调整后的sql已经放在上面了,这个sql在数据库里面查询就是正常的

    0 回复
  • fate sta fate sta VIP0
    2024/8/26

    正确的文本发一下我这边改一下

    0 回复
  • protected override string GetColumnInfosByTableNameSql
    {
        get
        {
            string sql = $@"
            SELECT
                CAST ( pclass.OID AS INT4 ) AS TableId,
                CAST ( ptables.tablename AS VARCHAR ) AS TableName,
                pcolumn.COLUMN_NAME AS DbColumnName,
                pcolumn.udt_name AS DataType,
                pcolumn.character_maximum_length AS LENGTH,
                pcolumn.column_default AS DefaultValue,
                col_description ( pclass.OID, pcolumn.ordinal_position ) AS ColumnDescription,
                CASE WHEN pkey.colname = pcolumn.COLUMN_NAME THEN TRUE ELSE FALSE END AS IsPrimaryKey,
                CASE WHEN UPPER ( pcolumn.column_default ) LIKE'NEXTVAL%' THEN TRUE ELSE FALSE END AS IsIdentity,
                CASE WHEN UPPER ( pcolumn.is_nullable ) = 'YES' THEN TRUE ELSE FALSE END AS IsNullable 
            FROM
                ( SELECT * FROM sys_tables WHERE UPPER ( tablename ) = UPPER ( '{{0}}' ) AND LOWER ( schemaname ) = '{GetSchema()}' ) ptables
                INNER JOIN sys_class pclass ON ptables.tablename = pclass.relname 
                AND relnamespace = ( SELECT OID FROM pg_namespace WHERE nspname = '{GetSchema()}' )
                INNER JOIN ( SELECT * FROM information_schema.COLUMNS WHERE table_schema = '{GetSchema()}' ) pcolumn ON pcolumn.TABLE_NAME = ptables.tablename
                LEFT JOIN (
                    SELECT
    	                sys_class.relname,
    	                sys_attribute.attname AS colname 
                    FROM sys_constraint
    	                INNER JOIN sys_class ON sys_constraint.conrelid = sys_class.OID AND sys_class.relnamespace = ( SELECT OID FROM pg_namespace WHERE nspname = '{GetSchema()}' )
    	                INNER JOIN sys_attribute ON sys_attribute.attrelid = sys_class.OID AND sys_attribute.attnum = sys_constraint.conkey [ 1 ]
    	                INNER JOIN sys_type ON sys_type.OID = sys_attribute.atttypid 
                    WHERE sys_constraint.contype = 'p' 
                ) pkey ON pcolumn.TABLE_NAME = pkey.relname 
            ORDER BY ptables.tablename";
    
    
            if (IsPgModel())
            {
                sql = sql.Replace("sys_", "pg_");
            }
            else if (IsSqlServerModel()) 
            {
    
                sql = sql.Replace("sys_", "pg_");
                sql = sql.Replace("pg_constraint.conkey[1]", "pg_constraint.conkey{{1}}");
                sql = sql.Replace("UPPER(", "pg_catalog.upper(");
                sql = sql.Replace("lower(", "pg_catalog.lower(");
                sql = sql.Replace("NEXTVAL%", "%nextval%");
                sql = sql.Replace("pcolumn.udt_name", "pcolumn.data_type");
                sql = sql.Replace("case when pkey.colname = pcolumn.column_name", "case when pkey.colname::text = pcolumn.column_name::text");
                sql = sql.Replace("pcolumn on pcolumn.table_name = ptables.tablename", "pcolumn on pcolumn.table_name::text = ptables.tablename::text ");
                sql = sql.Replace("pkey on pcolumn.table_name = pkey.relname", "pkey on pcolumn.table_name::text = pkey.relname::text ");
            }
            return sql;
        }
    }


    class:

    KdbndpDbMaintenance

    0 回复
  • fate sta fate sta VIP0
    2024/8/26

    SqlSugarCore 5.1.4.168-preview09


    过五分钟 更新一下这个版本测试一下 ,还有问题 加QQ沟通


    610262374

    0 回复
  • 这段时间没上论坛,已经没有这个问题了

    0 回复