Exemplo n.º 1
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);
            }
        }
Exemplo n.º 2
0
        // This needs its own emitter
        private static void ProcessAstTableColumnBaseNode(AstTableNode tableNode, ColumnsTSqlEmitter columnsEmitter, AstTableColumnBaseNode columnBase)
        {
            var tableReference = columnBase as AstTableColumnTableReferenceNode;
            var dimReference   = columnBase as AstTableColumnDimensionReferenceNode;
            var hashKey        = columnBase as AstTableHashedKeyColumnNode;

            if (hashKey != null)
            {
                var hashBytesBuilder = new StringBuilder();
                foreach (AstTableKeyColumnNode keyColumn in hashKey.Constraint.Columns)
                {
                    string expression = "+ HASHBYTES('SHA1',{0})";
                    switch (keyColumn.Column.ColumnType)
                    {
                    case ColumnType.AnsiString:
                    case ColumnType.AnsiStringFixedLength:
                    case ColumnType.String:
                    case ColumnType.StringFixedLength:
                        expression = String.Format(CultureInfo.InvariantCulture, expression, String.Format(CultureInfo.InvariantCulture, "UPPER(RTRIM(LTRIM([{0}])))", keyColumn.Column.Name));
                        break;

                    case ColumnType.Int16:
                    case ColumnType.Int32:
                    case ColumnType.Int64:
                    case ColumnType.UInt16:
                    case ColumnType.UInt32:
                    case ColumnType.UInt64:
                        expression = String.Format(CultureInfo.InvariantCulture, expression, String.Format(CultureInfo.InvariantCulture, "CONVERT(binary varying(64),{0})", keyColumn.Column.Name));
                        break;

                    default:
                        expression = String.Format(CultureInfo.InvariantCulture, expression, keyColumn.Column.Name);
                        break;
                    }

                    hashBytesBuilder.Append(expression);
                }

                string hashExpression = String.Format(CultureInfo.InvariantCulture, "(CONVERT(varbinary(32),HASHBYTES('SHA1',{0})))", hashBytesBuilder.ToString().Substring(1));
                hashExpression = String.Format(CultureInfo.InvariantCulture, "{0} PERSISTED NOT NULL UNIQUE", hashExpression);
                columnsEmitter.AddColumn(hashKey.Name, null, false, 0, 0, true, string.Empty, true, hashExpression);
            }
            else if (tableReference != null)
            {
                BindTableReference(tableNode, tableReference.Name, tableReference.Table, tableReference.IsNullable, columnsEmitter);
            }
            else if (dimReference != null)
            {
                BindTableReference(tableNode, dimReference.Name, dimReference.Dimension, dimReference.IsNullable, columnsEmitter);
            }
            else if (columnBase != null)
            {
                string type      = TSqlTypeTranslator.Translate(columnBase.ColumnType, columnBase.Length, columnBase.Precision, columnBase.Scale, columnBase.CustomType);
                bool   identity  = false;
                int    seed      = 1;
                int    increment = 1;
                foreach (AstTableKeyBaseNode keyBase in tableNode.Keys)
                {
                    var identityNode = keyBase as AstTableIdentityNode;
                    if (identityNode != null)
                    {
                        foreach (AstTableKeyColumnNode keyColNode in identityNode.Columns)
                        {
                            if (keyColNode.Column.Name.Equals(columnBase.Name, StringComparison.OrdinalIgnoreCase))
                            {
                                identity  = true;
                                seed      = identityNode.Seed;
                                increment = identityNode.Increment;
                            }
                        }
                    }
                }

                columnsEmitter.AddColumn(columnBase.Name, type, identity, seed, increment, columnBase.IsNullable, columnBase.Default, columnBase.IsComputed, columnBase.Computed);
            }
        }