예제 #1
0
        public static void ValidateLateArrivingLookup(AstLateArrivingLookupNode lookup)
        {
            if (!lookup.Table.LateArriving)
            {
                MessageEngine.Trace(lookup, Severity.Error, "V0128", "Table {0} is not designated for Late Arriving Lookup.  Set LateArriving = true.", lookup.Table.Name);
            }

            AstTableKeyBaseNode eligibleKey = null;

            foreach (AstTableKeyBaseNode key in lookup.Table.Keys)
            {
                if (key.Columns.Any(keyColumn => !keyColumn.Column.IsComputed))
                {
                    eligibleKey = key;
                    break; // Safe to do since we already verified single eligble key in the table processing pass
                }
            }

            if (eligibleKey == null)
            {
                MessageEngine.Trace(lookup, Severity.Error, "V0129", "Late Arriving Table {0} must specify an eligible key.", lookup.Table.Name);
            }

            // TODO: Finish checking this logic
            foreach (AstTableKeyColumnNode eligibleKeyColumn in eligibleKey.Columns)
            {
                if (!lookup.Inputs.Any(io => io.RemoteColumnName == eligibleKeyColumn.Column.Name))
                {
                    MessageEngine.Trace(lookup, Severity.Error, "V0123", "Late Arriving Lookup {0} must specify inputs for every column of constraint: {1}", lookup.Name, eligibleKey.Name);
                }
            }
        }
예제 #2
0
        private static void BindTableReference(AstTableNode tableNode, string refName, AstTableNode refTable, bool nullable, ColumnsTSqlEmitter columnsEmitter)
        {
            // TODO: This is wrong in general.  We need to ensure that this is always a single column constraint
            AstTableKeyBaseNode primaryKey = refTable.PreferredKey;

            if (primaryKey == null)
            {
                MessageEngine.Trace(tableNode, Severity.Warning, "V0243", "Table {0} lacks a primary, identity, or unique key", tableNode.Name);
                return;
            }

            // TODO: We currently support only a single primary key column.  This should be fixed :)
            foreach (AstTableKeyColumnNode keyCol in primaryKey.Columns)
            {
                string type = TSqlTypeTranslator.Translate(
                    keyCol.Column.ColumnType,
                    keyCol.Column.Length,
                    keyCol.Column.Precision,
                    keyCol.Column.Scale,
                    keyCol.Column.CustomType);
                columnsEmitter.AddColumn(refName, type, false, 0, 0, nullable, keyCol.Column.Default, false, String.Empty);
            }
        }