func()

in internal/database/sqlserver/sqlserver.go [323:369]


func (h sqlServerHandler) GenerateCommentSQL(db *database.DB, data *database.CommentData, enrichments map[string]bool) (string, error) {
	if data == nil {
		return "", fmt.Errorf("metadata cannot be nil")
	}
	if data.TableName == "" || data.ColumnName == "" {
		return "", fmt.Errorf("table and column names cannot be empty")
	}

	config := database.GetConfig() // Retrieve global config
	newMetadataComment := h.generateMetadataComment(data, enrichments)
	existingComment, err := h.GetColumnComment(context.Background(), db, data.TableName, data.ColumnName)
	if err != nil {
		return "", err
	}
	finalComment := h.mergeComments(existingComment, newMetadataComment, config.UpdateExistingMode) // Pass updateExistingMode

	// Check if comment already exists to decide between sp_addextendedproperty and sp_updateextendedproperty
	query := `
		SELECT CAST(value as NVARCHAR(MAX))
		FROM fn_listextendedproperty (N'MS_Description', N'SCHEMA', N'dbo', N'TABLE', @tableName, N'COLUMN', @columnName)
	`
	var existingCommentDB string
	err = db.QueryRow(query, sql.Named("tableName", data.TableName), sql.Named("columnName", data.ColumnName)).Scan(&existingCommentDB)
	if err != nil && err != sql.ErrNoRows {
		return "", fmt.Errorf("failed to check for existing comment: %w", err)
	}

	var sqlStmt string
	if err == sql.ErrNoRows {
		// No existing comment, use sp_addextendedproperty
		sqlStmt = fmt.Sprintf(
			"EXEC sp_addextendedproperty N'MS_Description', N'%s', N'SCHEMA', N'dbo', N'TABLE', %s, N'COLUMN', %s;",
			finalComment,
			h.QuoteIdentifier(data.TableName),
			h.QuoteIdentifier(data.ColumnName),
		)
	} else {
		// Existing comment found, use sp_updateextendedproperty
		sqlStmt = fmt.Sprintf(
			"EXEC sp_updateextendedproperty N'MS_Description', N'%s', N'SCHEMA', N'dbo', N'TABLE', %s, N'COLUMN', %s;",
			finalComment, // Use the merged comment
			h.QuoteIdentifier(data.TableName),
			h.QuoteIdentifier(data.ColumnName),
		)
	}
	return sqlStmt, nil
}