func()

in internal/database/sqlserver/sqlserver.go [435:501]


func (h sqlServerHandler) GenerateTableCommentSQL(db *database.DB, data *database.TableCommentData, enrichments map[string]bool) (string, error) {
	if data == nil || data.TableName == "" {
		return "", fmt.Errorf("table comment data cannot be nil or empty")
	}

	config := database.GetConfig()

	newMetadataComment := h.generateTableMetadataComment(data, enrichments)
	existingComment, err := h.GetTableComment(context.Background(), db, data.TableName)
	if err != nil {
		return "", err
	}
	finalComment := h.mergeComments(existingComment, newMetadataComment, config.UpdateExistingMode)

	if finalComment == "" {
		return "", nil
	}

	// Check if the extended property already exists for the table
	checkQuery := `
        SELECT 1
        FROM sys.extended_properties
        WHERE class = 1  -- Object or column
          AND class_desc = 'OBJECT_OR_COLUMN'
          AND major_id = OBJECT_ID(@tableName)
          AND minor_id = 0  -- Table level (minor_id is 0 for table)
          AND name = N'MS_Description';
    `

	var exists int
	err = db.QueryRow(checkQuery, sql.Named("tableName", data.TableName)).Scan(&exists)
	var sqlStmt string
	if err != nil && err != sql.ErrNoRows {
		// An actual error occurred during the check
		return "", fmt.Errorf("failed to check for existing table comment: %w", err)
	} else if err == sql.ErrNoRows {
		// No existing comment, use sp_addextendedproperty

		sqlStmt = fmt.Sprintf(`
            EXEC sp_addextendedproperty 
            @name = N'MS_Description', 
            @value = N'%s', 
            @level0type = N'SCHEMA', 
            @level0name = N'dbo', 
            @level1type = N'TABLE', 
            @level1name = %s;`,
			finalComment,
			h.QuoteIdentifier(data.TableName),
		)

	} else {
		//  Existing comment, use sp_updateextendedproperty
		sqlStmt = fmt.Sprintf(`
        EXEC sp_updateextendedproperty 
        @name = N'MS_Description', 
        @value = N'%s', 
        @level0type = N'SCHEMA', 
        @level0name = N'dbo', 
        @level1type = N'TABLE', 
        @level1name = %s;`,
			finalComment,
			h.QuoteIdentifier(data.TableName),
		)
	}

	return sqlStmt, nil
}